关于已编译语言的分析
当使用 autobuild 或 manual 构建模式分析已编译语言时,CodeQL 仅扫描在分析期间被构建的文件。因此,如果某些源代码未正确编译,扫描的代码行数将低于预期。这可能由多种原因导致。
-
CodeQL 的
autobuild功能使用启发式方法来构建仓库中的代码。然而,这种方法有时会导致仓库分析不完整。例如,当同一仓库中存在多个build.sh命令时,分析可能不完整,因为autobuild步骤只会执行其中一个命令,从而导致某些源文件未被编译。 -
某些编译器与 CodeQL 不兼容,可能会在代码分析时导致问题。例如,大多数厂商特定的 C 编译器无法被 CodeQL 识别。C 代码需要使用受支持的编译器(例如 GCC、Clang 或 MSVC)进行编译,才能被分析。
如果您的 CodeQL 分析扫描的代码行数少于预期,您可以尝试将构建模式改为 manual 并在工作流指定构建模式时明确指定构建命令;如果工作流中包含 autobuild 步骤,则用构建命令替代该步骤;或者检查 CodeQL 数据库中源文件的副本。
切换到 manual 构建流程
用您在生产环境中使用的相同构建命令替换 autobuild 过程。这可确保 CodeQL 完全了解如何编译您希望扫描的所有源文件。有关定义构建步骤的更多信息,请参阅 已编译语言的 CodeQL 代码扫描。
检查 CodeQL 数据库中源文件的副本
通过检查随 CodeQL 数据库一起包含的源代码副本,您可能能够了解为何某些源文件未被分析。要从 Actions 工作流获取数据库,请修改 CodeQL 工作流文件的 init 步骤并将 debug: true 设置为 true。
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
debug: true
这会将数据库作为 Actions 工件上传,您可以下载到本地机器。有关更多信息,请参阅 使用工作流工件存储和共享数据。
该工件将包含名为 src.zip 的归档副本,其中包括 CodeQL 扫描的源文件。如果将仓库中的源代码文件与 src.zip 中的文件进行对比,您可以看到缺少了哪些类型的文件。一旦了解哪些文件类型未被分析,就更容易弄清楚如何更改 CodeQL 分析的工作流。