Skip to main content

CodeQL 扫描的行数少于预期

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

关于编译的语言的分析

对于 C/C++、C#、Go、Java、Kotlin 和 Swift 等这样的已编译语言, CodeQL 仅扫描分析期间生成的文件。 因此,如果某些源代码未正确编译,则扫描的代码行数将低于预期。 这可能是多种原因引起的:

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

  2. 某些编译器无法使用 CodeQL ,因此在分析代码时可能会导致问题。 例如,CodeQL 无法识别大多数特定于供应商的 C 编译器。 C 代码需要使用已识别的编译器编译(例如 GCC、Clang 或 MSVC)才能进行分析。

如果 CodeQL 分析扫描的代码行数少于预期,则可以尝试 将步骤替换为 autobuild 生成命令(如果工作流包含步骤 autobuild),或者检查 CodeQL 数据库中源文件的副本。

替换步骤 autobuild

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 分析的工作流程。