CodeQL 结果疑难解答
本单元提供有关在使用 CodeQL 和代码扫描时进行优化和故障排除的提示。
优化 CodeQL 分析运行时
可能导致 CodeQL 分析耗时过长的几个原因如下:
- 如果使用自承载运行程序进行 CodeQL 分析,则可以增加内存或核心数。
- 当存储库包含多种语言时,可能会出现问题。 可以修改工作流以使用加速多种语言分析的矩阵。 每个语言的分析都与默认 CodeQL 分析工作流并行运行。 如果高级工作流设置为按顺序运行语言初始化和分析,则可能需要类似地配置高级工作流。
- 要分析的代码量可能会导致长时间运行时。 分析时间通常与要分析的代码量成正比。 可以通过排除测试代码或将代码分解为多个工作流来减小代码的大小,以仅分析每个扫描的子集。
- 如果在
schedule或push事件中分析速度太慢,可能需要仅对pull_request事件触发分析。
优化 CodeQL 查询
某些性能问题可能来自自定义查询。 可以在 CodeQL 文档中找到常见问题以及如何排查查询性能问题。
在处理 CodeQL 和 QL 查询语言时,请注意以下要点:
- CodeQL 谓词和类评估为数据库表。 大型谓词生成包含许多行的大型表,因此计算成本高昂。
- QL 语言是通过标准数据库作和关系代数(例如联接、投影和联合)实现的。
- 查询是自下而上评估的,这意味着在评估某个谓词所依赖的所有谓词之前,不会评估该谓词。
调试工件
可以获取项目以帮助调试 CodeQL 代码扫描的问题。 修改 CodeQL 工作流文件的init步骤,然后设置debug: true。 调试项目作为名为 debug-artifacts 的项目上传到工作流运行。 数据包含 CodeQL 日志、CodeQL 数据库和工作流生成的任何 SARIF 文件。
对 VS Code 的 CodeQL 扩展进行故障排除
VS Code 扩展的日志文件包含详细信息,可帮助你进行故障排除。
进度和错误消息以通知形式显示在工作区的右下角。 可以使用 CodeQL 扩展日志 下拉列表选择所需的日志。
常见错误消息
若要对 CodeQL 工作流进行故障排除,请熟悉以下常见错误消息。
错误:“服务器错误”
如果工作流因服务器错误而运行代码扫描失败,则暂时性通信问题可能是原因。 再次尝试运行工作流。 如果问题仍然存在,请联系 GitHub 支持部门。
错误:“磁盘不足”或“内存不足”
对于项目过大,CodeQL 可能会在运行过程中耗尽磁盘空间或内存。 如果它是托管的 GitHub Actions 运行程序,请联系 GitHub 支持部门来调查问题。 如果是自托管运行器,则可能需要调整服务器的参数。 有关详细信息,请参阅 有关运行 CodeQL 的建议硬件的 CodeQL 文档。
错误:使用 Dependabot 时,403“无法通过集成访问资源”
在触发工作流运行时,Dependabot 被视为不受信任。 工作流在只读范围内运行。 上传分支的代码扫描结果通常需要 security_events: write scope。 但是,代码扫描始终允许在 pull_request 事件触发操作运行时上传结果。 对于 Dependabot 分支,建议使用 pull_request 事件而不是 push 事件。
一种简单的方法是,在推送到默认分支和任何其他重要的长时间运行的分支以及针对这组分支创建的拉取请求时运行。
下面是一个示例:
on:
push:
branches:
- main
pull_request:
branches:
- main
错误:“由于默认设置,SARIF 上传被拒绝”
启用 CodeQL 默认设置时,会阻止 SARIF 上传。 当进程尝试将包含 CodeQL 分析结果的 SARIF 文件上传到启用了默认设置的存储库时,会出现此错误。 如果通过 REST API 和 CodeQL CLI 完成上传,也会发生此错误。 当多个系统生成类似的代码扫描警报时,此块可以减少用户混淆的可能性。
此错误仅适用于包含使用 CodeQL 创建的结果的 SARIF 文件。 若要修复此错误,请在存储库中禁用 CodeQL,然后重试上传 SARIF 文件。
延伸阅读
有关故障排除的详细信息,请参阅 用于对代码扫描进行故障排除的 CodeQL 文档。