Skip to main content

CodeQL 扫描的行数少于预期

如果 CodeQL 分析的代码少于预期,则可能需要使用自定义生成命令。

关于编译的语言的分析

使用 autobuildmanual 生成模式分析已编译语言时, CodeQL 仅扫描分析期间生成的文件。 因此,如果某些源代码未正确编译,则扫描的代码行数将低于预期。 这可能是多种原因引起的:

  1. CodeQL autobuild 功能使用启发式方法在存储库中生成代码。 但是,有时这种方法会导致对存储库的分析不完整。 例如,当单个存储库中存在多个 build.sh 命令时,分析可能不完整,因为 autobuild 步骤将仅执行其中一个命令,因此可能无法编译某些源文件。

  2. 某些编译器无法使用 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 分析的工作流程。