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