Skip to main content

SARIF 结果文件太大

不能将大于 10 MB 的 SARIF 结果文件上传到 code scanning。 探索生成包含最大影响结果的较小文件的方法。

关于此错误

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

如果进程尝试上传的 SARIF 文件超过最大大小 (10 MB),则会报告其中一个错误。 Code scanning 不接受超过此大小的文件。 可通过多种不同的方法减少为上传到 code scanning 而生成的结果数。

对于 CodeQL 或第三方分析工具生成的 SARIF 文件,你可能会看到此错误。 有关 code scanning 上传限制的信息,请参阅“对代码扫描的 SARIF 支持”。

确认错误原因

导致 SARIF 结果文件过大的可能原因有很多。

SARIF 文件压缩

查看 code scanning 拒绝的结果文件,看看是否存在以下情况:

  • 使用 gzip 压缩了 SARIF 文件
  • 压缩文件小于 10 MB

如果未使用 gzip 压缩文件,请尝试在重新运行上传过程之前压缩该文件。 如果压缩文件仍然太大,则需要配置分析以生成较小的结果集。

分析的代码量

如果有太多结果,则应将分析配置为仅分析最重要的代码。

  • 对于解释语言,检查存储库是否包含许多测试、演示或供应商依赖项,其中修复警报的优先级较低。 尝试从分析中排除此代码。 有关详细信息,请参阅“从解释语言的分析中排除代码”。
  • 对于编译语言,检查生成过程是否生成多个代码变体(例如,多个操作环境或体系结构的目标)。 尝试一开始只分析代码的一个变体。 有关详细信息,请参阅“优化生成命令”。

查询运行数

如果仍有太多结果,则检查用于分析代码的查询数。 尝试运行更少的查询。 修复初始警报后,可以重新引入其他查询。 例如,对于 CodeQL 分析,可以只运行默认的查询套件。 有关详细信息,请参阅“自定义代码扫描的高级设置”。

查询找到的结果数

有时,单个查询会报告许多结果,因为代码库具有特定的编码样式,或者因为分析不理解特定库。 可以在 SARIF 查看器中查看结果文件,以查看结果的分布情况。 例如,https://microsoft.github.io/sarif-web-component/。

  • 检查结果是否由单个查询标识的警报主导。 尝试从分析中排除该查询。 可以在修复其他警报时重新引入它。 有关 CodeQL 查询配置的详细信息,请参阅“从分析中排除查询”。
  • 检查是否存在具有许多深层路径的数据流查询。 尝试从输出中省略数据流路径。 有关 CodeQL 分析配置的详细信息,请参阅“从输出省略数据流路径”。

修复问题

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

从解释语言的分析中排除代码

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

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

优化生成命令

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

  • CodeQL 针对 code scanning 的高级设置:更新工作流文件以指定所选的生成命令。 有关详细信息,请参阅“对编译语言进行 CodeQL 代码扫描”。
  • CodeQL CLI database create:若要指定所选的生成命令,可以通过使用 --command 选项来调用 database create 命令,或通过在 YAML 配置文件中定义生成命令进行代码扫描并使用 --codescanning-config 选项调用文件。 有关详细信息,请参阅“为 CodeQL 分析准备代码”。

定义要运行的查询套件

你可能已经只运行了默认安全查询,但最好检查下。

  • CodeQL 针对 code scanning 的高级设置:检查工作流文件中是否存在 queries 关键字。 如果不存在,则只运行默认查询套件。 如果存在,则定义要运行的查询。 尝试注释掉工作流文件的这一行。 有关详细信息,请参阅“自定义代码扫描的高级设置”。
  • CodeQL CLI database analyze:检查数据库分析命令是否存在任何指定查询、查询套件或查询包的路径。 如果不存在,则只运行默认查询套件。 如果存在,则定义要运行的查询,你可以尝试从调用中删除它们。 有关详细信息,请参阅“使用 CodeQL 查询分析代码”。

从分析中排除查询

如果结果由单个规则的结果主导,则从分析中排除该规则可能是最佳解决方案。

  • CodeQL 针对 code scanning 的高级设置:使用 query-filters 关键字从分析中排除一个或多个查询。 有关详细信息,请参阅“自定义代码扫描的高级设置”。
  • CodeQL CLI database analyze:更新数据库分析命令以从分析中排除一个或多个查询。 有关详细信息,请参阅“使用 CodeQL 查询分析代码”。

或者,可以使用 filter-sarif 操作等工具重写 SARIF 文件,以通过排除模式排除特定检测。

从输出中省略数据流路径

如果 SARIF 结果中突出显示许多深层代码路径,则可以减少为每个警报报告的路径数。

  • code scanning 的 CodeQL 高级设置:更新 analyze 步骤以将路径数限制为最大值 1 或 0。

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v2
      env: 
        CODEQL_ACTION_EXTRA_OPTIONS: '{"database":{"interpret-results":["--max-paths", 1]}}'
    
  • CodeQL CLI database analyze:更新数据库分析命令以包含 --max-paths=1 标志。 有关详细信息,请参阅“数据库分析”。

Note

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

延伸阅读