You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeQL C#查询执行失败:无法直接调用抽象方法等报错

问题描述

尝试执行一个简单的CodeQL查询以列出对GetSanitizedName方法的调用,但执行失败。用于重现错误的脚本如下:

set -x

TEST_DIR="/tmp/test"
DB_HOME="/tmp/test/cq"
QUERY_TEST="/tmp/test/query1.ql"

sudo rm -r $TEST_DIR
mkdir $TEST_DIR && cd $TEST_DIR
mkdir $DB_HOME

echo "import csharp

from MethodCall call, Method method
where
  call.getTarget() = method and
  method.hasName(\"GetSanitizedName\")
select call" > $QUERY_TEST

echo "---
name: codeql/test1
dependencies:
  codeql/csharp-all: ^0.8.1" > qlpack.yml

git clone https://github.com/citrus-thunder/clisharp.git
codeql database create $DB_HOME --language=csharp --threads=0 --source-root=/tmp/test/clisharp
codeql pack install
codeql database analyze --format="csv" --output="./out.csv" $DB_HOME $QUERY_TEST

执行后出现以下错误:

Compiling query plan for /tmp/test.ql.

错误:无法直接调用抽象方法NodeImpl.getAstNode() (/Users/user/.codeql/packages/codeql/csharp-all/0.8.1/semmle/code/csharp/controlflow/ControlFlowGraph.qll:30,60-70)
错误:类不得扩展参数 (/Users/user/.codeql/packages/codeql/dataflow/0.1.1/codeql/dataflow/internal/DataFlowImplCommon.qll:77,35-39)
错误:类不得扩展参数 (/Users/user/.codeql/packages/codeql/dataflow/0.1.1/codeql/dataflow/internal/DataFlowImplCommon.qll:89,27-41)
错误:类不得在其参数化模块外扩展 (/Users/user/.codeql/packages/codeql/dataflow/0.1.1/codeql/dataflow/internal/DataFlowImplCommon.qll:93,33-37)
错误:类不得扩展参数 (/Users/user/.codeql/packages/codeql/controlflow/0.1.1/codeql/controlflow/Cfg.qll:820,35-47)
错误:类不得扩展参数 (/Users/user/.codeql/packages/codeql/controlflow/0.1.1/codeql/controlflow/Cfg.qll:1252,47-65)
错误:类不得扩展参数 (/Users/user/.codeql/packages/codeql/controlflow/0.1.1/codeql/controlflow/Cfg.qll:1258,47-65)
错误:类不得扩展参数 (/Users/user/.codeql/packages/codeql/controlflow/0.1.1/codeql/controlflow/Cfg.qll:130,42-54)
错误:类不得扩展参数 (/Users/user/.codeql/packages/codeql/controlflow/0.1.1/codeql/controlflow/Cfg.qll:338,36-46)
错误:谓词getAstNode的结果类型为ControlFlowElement,与被重写谓词的结果类型AstNode不匹配 (/Users/user/.codeql/packages/codeql/csharp-all/0.8.1/semmle/code/csharp/controlflow/ControlFlowGraph.qll:30,30-40)

错误分析

这些错误本质是CodeQL版本不兼容:

  • 指定的codeql/csharp-all: ^0.8.1是非常老旧的版本,与当前使用的CodeQL CLI版本存在语法和API差异。
  • 旧版本的C#包依赖的dataflow、controlflow等基础包版本过低,这些包的语法规则在新版本CodeQL中已被修改,导致编译时出现类扩展、方法重写等语法错误。
解决方案

1. 更新QL包依赖版本

修改qlpack.yml,使用与当前CodeQL CLI兼容的最新C#包版本。如果不确定兼容版本,可以直接省略版本号,让CodeQL自动匹配CLI对应的包版本:

---
name: codeql/test1
dependencies:
  codeql/csharp-all: "*"

2. 重新创建数据库并执行查询

旧版本的数据库可能与新版本查询不兼容,需要删除原有数据库后重新创建:

# 清理旧数据
sudo rm -r $TEST_DIR
mkdir $TEST_DIR && cd $TEST_DIR
mkdir $DB_HOME

# 重新写入查询和qlpack文件(使用更新后的qlpack内容)
echo "import csharp

from MethodCall call, Method method
where
  call.getTarget() = method and
  method.hasName(\"GetSanitizedName\")
select call" > $QUERY_TEST

echo "---
name: codeql/test1
dependencies:
  codeql/csharp-all: "*"" > qlpack.yml

git clone https://github.com/citrus-thunder/clisharp.git
codeql database create $DB_HOME --language=csharp --threads=0 --source-root=/tmp/test/clisharp
codeql pack install
codeql database analyze --format="csv" --output="./out.csv" $DB_HOME $QUERY_TEST

3. 可选:验证CodeQL CLI版本

确保使用的CodeQL CLI是最新版本,可通过以下命令更新:

codeql version
# 如果版本过旧,执行更新
codeql pack upgrade

内容的提问来源于stack exchange,提问作者ravid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:33:13