跳至主要内容

SARIF 结果文件太大

您无法将大于 10 MB 的 SARIF 结果文件上传到代码扫描。探索生成包含最高影响结果的较小文件的方法。

关于此错误

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://microsoft.github.io/sarif-web-component/

  • 检查结果是否主要由单个查询识别的警报控制。尝试将该查询从分析中排除。在修复其他警报后,您可以重新引入它。有关 CodeQL 查询配置的更多信息,请参阅“排除查询”。
  • 检查是否有许多深度路径的数据流查询。尝试从输出中省略数据流路径。有关 CodeQL 分析配置的更多信息,请参阅“从输出中省略数据流路径”。

解决问题

以下选项按复杂度顺序排列。您需要修改配置以将结果数量减少到可管理的大小。修复所有这些警报后,您可以更新配置以扩展分析以涵盖更多代码或运行更多查询。

排除解释型语言的代码

从分析中排除非生产代码是减少结果文件大小的一种简单方法。

  • 代码扫描的 CodeQL 高级设置:在工作流文件中使用pathspaths-ignore指定要分析的代码。有关更多信息,请参阅“自定义代码扫描的高级设置”。
  • CodeQL CLI database create:使用相同的语法创建代码扫描的 YAML 配置文件以定义要分析的代码。更新database create命令以使用--codescanning-config选项调用此配置文件。有关更多信息,请参阅“自定义代码扫描的高级设置”。

优化构建命令

使用仅编译一个变体的构建命令是减少结果文件大小的一种简单方法。

  • 代码扫描的 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@v3
      env: 
        CODEQL_ACTION_EXTRA_OPTIONS: '{"database":{"interpret-results":["--max-paths", 1]}}'
    
  • CodeQL CLI 的 database analyze 命令:更新数据库分析命令以包含 --max-paths=1 标志。有关更多信息,请参阅“database analyze”。

注意

max-paths 设置会影响所有数据流查询的结果。

进一步阅读