关于此错误
SARIF file is too large
SARIF results file is too large
SARIF upload is rejected (bigger than allowed size for zip archive)
SARIF ZIP upload is too large
A fatal error occurred: SARIF file is too large
413: Payload Too Large
如果进程尝试上传大于 10 MB 的 SARIF 文件,就会报告这些错误之一。代码扫描不接受超过此大小的文件。有多种不同的方法可以减少生成用于上传到代码扫描的结果数量。
您可能会在 CodeQL 或第三方分析工具生成的 SARIF 文件中看到此错误。有关上传限制的信息,请参阅代码扫描,参见 SARIF 对代码扫描的支持。
确认错误原因
导致 SARIF 结果文件异常大的原因有很多。
SARIF 文件压缩
查看代码扫描拒绝的结果文件,看看是否
- SARIF 文件已使用 gzip 压缩
- 压缩后的文件小于 10 MB
如果文件未使用 gzip 压缩,请在重新运行上传过程之前尝试先压缩文件。如果压缩后文件仍然过大,则需要配置分析以生成更小的结果集。
分析的代码量
如果结果太多,您应当配置分析仅针对最关键的代码进行。
- 对于解释型语言,请检查仓库中是否包含大量测试、演示或供应的依赖项,这些代码的警报修复优先级较低。尝试在分析中排除这些代码。更多信息请参阅 对解释型语言排除代码进行分析。
- 对于编译型语言,请检查构建过程是否生成了多个变体(例如面向不同操作系统或架构的目标)。尝试先只分析其中一个变体。更多信息请参阅 优化构建命令。
运行的查询数量
如果结果仍然过多,请检查您用于分析代码的查询数量。尝试减少查询的数量。您可以在修复初始警报后重新引入其他查询。例如,对于 CodeQL 分析,您可以仅运行默认的查询套件。更多信息请参阅 代码扫描的工作流配置选项。
查询发现的结果数量
有时单个查询会报告大量结果,可能是因为代码库采用了特定的编码风格,或是分析未能识别某个库。您可以在 SARIF 查看器中审阅结果文件,以了解结果的分布情况。例如,https://msdocs.cn/sarif-web-component/。
- 检查结果是否被单个查询的警报所主导。尝试在分析中排除该查询。修复其他警报后可以重新引入它。更多关于 CodeQL 查询配置的信息,请参阅 从分析中排除查询。
- 检查是否存在带有大量深层路径的数据流查询。尝试在输出中省略数据流路径。更多关于 CodeQL 分析配置的信息,请参阅 在输出中省略数据流路径。
解决问题
以下选项按复杂度顺序列出。您需要修改配置,以将结果数量减少到可管理的规模。等所有这些警报都修复后,您可以更新配置,扩展分析范围或运行更多查询。
对解释型语言排除代码进行分析
排除非生产代码是减少结果文件大小的简便方法。
- CodeQL 高级设置(代码扫描):在工作流文件中使用
paths和paths-ignore指定要分析的代码。更多信息请参阅 代码扫描的工作流配置选项。 - CodeQL CLI
database create:使用相同语法在 YAML 配置文件中定义要分析的代码,以供代码扫描使用。使用--codescanning-config选项调用该配置文件来更新database create命令。更多信息请参阅 代码扫描的工作流配置选项。
优化构建命令
使用仅编译单一变体的构建命令是减少结果文件大小的简便方法。
- CodeQL 高级设置(代码扫描):更新工作流文件以指定您选择的构建命令。更多信息请参阅 编译型语言的 CodeQL 代码扫描。
- CodeQL CLI
database create:通过--command选项在调用database create时指定您的构建命令,或在用于代码扫描的 YAML 配置文件中定义该命令并使用--codescanning-config选项调用该文件。更多信息请参阅 准备代码进行 CodeQL 分析。
定义要运行的查询套件
您可能已经只运行默认的安全查询,但仍值得检查一下。
- CodeQL 高级设置(代码扫描):检查工作流文件中的
queries关键字。如果不存在,则只运行默认查询套件;如果存在,则定义要运行的查询。尝试注释掉工作流文件中的此行。更多信息请参阅 代码扫描的工作流配置选项。 - CodeQL CLI
database analyze:检查数据库分析命令中是否包含指定查询、查询套件或查询包的路径。如果没有,则只运行默认查询套件;如果有,则它们定义了要运行的查询,您可以尝试从调用中移除它们。更多信息请参阅 使用 CodeQL 查询分析代码。
从分析中排除查询
如果结果主要由单个规则的警报主导,排除该规则可能是最佳解决方案。
- CodeQL 高级设置(代码扫描):使用
query-filters关键字从分析中排除一个或多个查询。更多信息请参阅 代码扫描的工作流配置选项。 - CodeQL CLI
database analyze:更新数据库分析命令,以从分析中排除一个或多个查询。更多信息请参阅 使用 CodeQL 查询分析代码。
另外,您也可以使用 filter-sarif 操作,通过排除模式重写 SARIF 文件,以排除特定检测。
省略输出中的数据流路径
如果 SARIF 结果中突出显示了大量深层代码路径,您可以减少每个警报报告的路径数量。
-
CodeQL 高级设置(代码扫描):更新
analyze步骤,将路径数量限制为最多一个或零。- name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v4 env: CODEQL_ACTION_EXTRA_OPTIONS: '{"database":{"interpret-results":["--max-paths", 1]}}' -
CodeQL CLI
database analyze:在数据库分析命令中加入--max-paths=1标志。更多信息请参阅 database analyze。
注意
max-paths 设置会影响所有数据流查询的结果。