关于编译的语言的分析
使用 autobuild
或 manual
生成模式分析已编译语言时, CodeQL 仅扫描分析期间生成的文件。 因此,如果某些源代码未正确编译,则扫描的代码行数将低于预期。 这可能是多种原因引起的:
-
CodeQL
autobuild
功能使用启发式方法在存储库中生成代码。 但是,有时这种方法会导致对存储库的分析不完整。 例如,当单个存储库中存在多个build.sh
命令时,分析可能不完整,因为autobuild
步骤将仅执行其中一个命令,因此可能无法编译某些源文件。 -
某些编译器无法使用 CodeQL ,因此在分析代码时可能会导致问题。 例如,CodeQL 无法识别大多数特定于供应商的 C 编译器。 C 代码需要使用已识别的编译器编译(例如 GCC、Clang 或 MSVC)才能进行分析。
如果 CodeQL 分析扫描的代码行数少于预期,则可以尝试 (如果 manual
工作流指定生成模式),并在工作流指定生成模式时指定生成命令, 将步骤替换为 autobuild
生成命令(如果工作流包含步骤 autobuild
),或者检查 CodeQL 数据库中源文件的副本。
更改为 manual
生成模式{process
将 autobuild
流程替换为将在生产中使用的相同生成命令。 这可以确保 CodeQL 确切地知道如何编译要扫描的所有源文件。
有关定义生成步骤的详细信息,请参阅 “对编译语言进行 CodeQL 代码扫描”。
检查 CodeQL 数据库中源文件的副本
您可以通过检查 CodeQL 数据库中包含的源代码副本来了解为什么没有分析某些源文件。 要从 Actions 工作流中获取数据库,请修改 CodeQL 工作流文件的 init
步骤,并设置 debug: true
。
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
debug: true
这会将数据库作为操作构件上传,您可以将其下载到本地计算机。 有关详细信息,请参阅“从工作流存储和共享数据”。
该构件将包含由名为 src.zip 的 CodeQL 扫描的源文件存档副本。 如果比较存储库中的源代码文件和 src.zip 中的文件,则可以看到缺少哪些类型的文件。 一旦您知道了哪些类型的文件没有被分析,就更容易理解了如何更改 CodeQL 分析的工作流程。