跳至主要内容

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://msdocs.cn/sarif-web-component/

  • 检查结果是否被单个查询的警报所主导。尝试在分析中排除该查询。修复其他警报后可以重新引入它。更多关于 CodeQL 查询配置的信息,请参阅 从分析中排除查询
  • 检查是否存在带有大量深层路径的数据流查询。尝试在输出中省略数据流路径。更多关于 CodeQL 分析配置的信息,请参阅 在输出中省略数据流路径

解决问题

以下选项按复杂度顺序列出。您需要修改配置,以将结果数量减少到可管理的规模。等所有这些警报都修复后,您可以更新配置,扩展分析范围或运行更多查询。

对解释型语言排除代码进行分析

排除非生产代码是减少结果文件大小的简便方法。

  • CodeQL 高级设置(代码扫描):在工作流文件中使用 pathspaths-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 查询分析代码

从分析中排除查询

如果结果主要由单个规则的警报主导,排除该规则可能是最佳解决方案。

另外,您也可以使用 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 设置会影响所有数据流查询的结果。

延伸阅读

© . This site is unofficial and not affiliated with GitHub, Inc.