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

