Skip to main content

此版本的 GitHub Enterprise Server 将于以下日期停止服务 2026-03-17. 即使针对重大安全问题,也不会发布补丁。 为了获得更好的性能、更高的安全性和新功能,请升级到最新版本的 GitHub Enterprise。 如需升级帮助,请联系 GitHub Enterprise 支持

CodeQL 扫描的行数少于预期

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

关于编译的语言的分析

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

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

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

如果 CodeQL 分析扫描的代码行数少于预期,您可以尝试将构建模式更改为 manual,并在工作流指定构建模式时,指定构建命令;如果您的工作流包含 autobuild 步骤,则用构建命令替换 autobuild 步骤;或者检查 CodeQL 数据库中源文件的副本。

更改为 manual 编译流程

autobuild 流程替换为将在生产中使用的相同生成命令。 这可以确保 CodeQL 确切地知道如何编译要扫描的所有源文件。 有关定义编译步骤的详细信息,请参阅 对编译语言进行 CodeQL 代码扫描

检查 CodeQL 数据库中源文件的副本

您可以通过检查 CodeQL 数据库中包含的源代码副本来了解为什么没有分析某些源文件。 要从 Actions 工作流中获取数据库,请修改 CodeQL 工作流文件的 init 步骤,并设置 debug: true

- name: Initialize CodeQL
  uses: github/codeql-action/init@v4
  with:
    debug: true

这会将数据库作为操作构件上传,您可以将其下载到本地计算机。 有关详细信息,请参阅“使用工作流工件存储和共享数据”。

该构件将包含由 CodeQL 扫描的源文件的存档副本,文件名为 src.zip。 如果比较存储库中的源代码文件和 src.zip 中的文件,则可以看到缺少哪些类型的文件。 一旦您知道了哪些类型的文件没有被分析,就更容易理解了如何更改 CodeQL 分析的工作流程。