代码扫描疑难解答

通常,如果遇到 CodeQL 执行错误,CodeQL CLI 则会报告它作为退出代码而运行的每个命令的状态。 退出代码可为后续命令或依赖于 CodeQL CLI 的其他工具提供信息。 有关退出代码的详细信息,请参阅退出代码

错误:'database finalize' CodeQL 命令 (32)

此错误表示完成 CodeQL 数据库创建时出现问题,而这可能源于提取错误或缺少生成步骤。

故障排除步骤:

  1. 验证代码是否存在并已编译
    • 对于已编译的语言,请验证生成流程是否正在编译代码,且正在 AdvancedSecurity-Codeql-InitAdvancedSecurity-Codeql-Analyze 任务之间进行。 你可在指定生成命令中找到常见生成命令和所需的标志(例如,“干净且无缓存/无守护程序”)。
    • 对于已解释的语言,请确认项目中存在针对指定语言的某些源代码。
  2. 检查提取错误
    • 验证提取错误是否会影响 CodeQL 数据库的运行状况。
    • 查看日志文件,了解提取错误和警告,以便评估总体数据库运行状况。
  3. 调查严重错误
    • 如果大多数文件遇到提取程序错误,则请进一步调查以了解提取不当的根本原因。

错误:自动生成脚本 (1)

此错误描述了某一自动生成故障,并表明代码扫描设置或配置出现问题。

故障排除步骤:

错误:在代理工具缓存中未找到 CodeQL 目录

此错误表示安装适用于自托管代理的 CodeQL 时出现问题。

故障排除步骤:

错误:未设置语言管道变量

尝试运行 CodeQL 而未设置用于指定要扫描哪些语言的管道变量时,会出现此错误。

故障排除步骤:

未返回任何结果的 CodeQL

本节提供针对 CodeQL 分析未生成任何结果的情况的相关指导。

故障排除步骤:

  1. 检查是否存在已检测到的漏洞
    • 请考虑代码可能真无漏洞的可能性。 如果预计存在漏洞但未检测到,这请继续进行验证。
  2. 查看查询套件配置
    • 确认正在使用的查询套件,并在必要时考虑切换到更全面的套件。
    • 或者,也可创建自定义查询套件以进行定制分析。
  3. 调整用于查看结果的权限
    • 确保已授予适当的权限(至少为参与者级别)以访问分析结果。 有关详细信息,请参阅 Advanced Security 权限

CodeQL 超时

如果AdvancedSecurity-Codeql-Analyze@1任务正在显示This job was abandoned ... we lost contact with the agent,并且你正在使用托管的 Microsoft 代理,则任务将达到付费托管代理的内置 6 小时超时。 你可以尝试对自托管代理运行分析。

代码扫描任务权限

代码扫描生成任务使用管道标识来调用高级安全 REST API。 默认情况下,同一项目中的管道有权上传通过运行 CodeQL 分析生成的 SARIF 文件。 如果从生成服务帐户中删除了这些权限,或者拥有自定义设置(例如,托管在与存储库不同的项目中的管道),则必须手动授予这些权限。

故障排除步骤:

  • 向管道中使用的生成服务帐户授予 Advanced Security: View alertsAdvanced Security: Manage and dismiss alerts 权限。对于项目范围的管道,该帐户为 [Project Name] Build Service ([Organization Name]);对于集合范围的管道,该帐户为 Project Collection Build Service ([Organization Name])

将 CodeQL 捆绑包手动安装到自托管代理

通过使用 GitHub 上提供的体系结构安装脚本,将 CodeQL 捆绑包安装到代理工具缓存。 这些脚本要求将 $AGENT_TOOLSDIRECTORY 环境变量设置为代理上的代理工具目录的位置,例如 C:/agent/_work/_tool。 或者,可以手动执行以下步骤:

  1. GitHub 选择最新的 CodeQL 发布捆绑包。
  2. 下载捆绑包并将其解压缩到代理工具目录中的以下目录(通常位于 _work/_tool 下):./CodeQL/0.0.0-[codeql-release-bundle-tag]/x64/。 使用最新版本的 v2.16.0,文件夹名称为 ./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64/。 详细了解代理工具目录
  3. ./CodeQL/0.0.0-[codeql-release-bundle-tag] 文件夹内创建名为 x64.complete 的空文件。 以上面的示例为例,x64.complete 文件的结束文件路径为 ./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64.complete