Skip to main content

鉴定拉取请求中的代码扫描警报

当在拉取请求中 code scanning 标识出问题时,你可以查看突出显示的代码并解决警报。

谁可以使用此功能?

具有读取访问权限的用户

根据配置,code scanning 结果可能会显示为拉取请求中的检查结果和注释。 有关详细信息,请参阅“关于代码扫描警报”。

查看检查结果code scanning

对于所有code scanning配置,包含code scanning结果的检查为:Code scanning 结果。 所使用的每个分析工具的结果将单独显示。 拉取请求中更改的代码行的任何新警报都会显示为批注。

要查看所分析分支的完整警报集,请单击查看所有分支警报。 这将打开完整的警报视图,你可以在其中按类型、严重性、标记等筛选分支上的所有警报。有关详细信息,请参阅 访问存储库的代码扫描警报

拉取请求的 Code scanning 结果检查的屏幕截图。 “查看所有分支警报”链接以深橙色边框突出显示。

管理检查失败的严重性级别

          code scanning如果结果检查发现任何严重性为`error`、`critical`或`high`的问题,则检查失败,并且在检查结果中报告错误。 如果找到 code scanning 的所有结果的严重性较低,则警报将被视为警告或注释,并且检查成功。

拉取请求中合并框的屏幕截图。 “代码扫描结果/CodeQL”检查有“1 个新警报,包括 1 个高严重性安全…”

你可以通过指定会导致拉取请求检查失败的严重级别和安全严重性来覆盖仓库设置中的默认行为。 有关详细信息,请参阅“代码扫描的工作流配置选项”。

诊断您的code scanning配置问题

根据配置,你可能会看到针对已配置的拉取请求 code scanning 运行的其他检查。 这些通常是分析代码或上传 code scanning 结果的工作流。 当分析出现问题时,这些检查对于故障排除非常有用。

例如,如果存储库使用CodeQL 分析工作流程CodeQL /分析(LANGUAGE),则会在结果检查运行之前对每种语言进行检查。 分析检查可能会失败,如果存在配置问题,或者拉取请求中断了分析编译的语言(例如,C/C++、C#、Go、Java、Kotlin、Rust、和 Swift)的构建。

与其他拉取请求检查一样,你可以在检查选项卡上查看检查失败的完整详细信息。有关配置和故障排除的详细信息,请参阅 代码扫描的工作流配置选项代码扫描分析错误疑难解答

查看拉取请求上的警报

通过查看code scanning”选项卡****,Code scanning可以查看拉取请求中引入的更改的差异中的任何警报。在触发警报的代码行上发布一个拉取请求评审,其中显示每个警报作为注释。 可以对警报进行注释、关闭警报并直接从注释中查看警报的路径。 可以通过单击“显示更多详细信息”链接来查看警报的完整详细信息,该链接将带你进入警报详细信息页面。

屏幕截图显示了拉取请求“对话”选项卡上的警报注释。 “显示更多详细信息”链接以深橙色框出。

还可以在code scanning选项卡中查看拉取请求中引入的更改差异内的所有**** 告警。

如果在拉取请求中添加了新的代码扫描配置,则会看到有关拉取请求的注释,指示你到 Security and quality 存储库的选项卡,以便可以查看拉取请求分支上的所有警报。 有关查看存储库警报的详细信息,请参阅 访问存储库的代码扫描警报

如果您拥有仓库的写入权限,则某些注释将包含警报额外上下文的链接。 在上面的示例中,您可以从 分析 中单击 用户提供的值 以查看不受信任的数据进入数据流的位置,此处称为源。 在此例中,还可以通过单击显示路径来查看从源到使用数据的代码(池)的完整路径。 这样就很容易检查数据是否不受信任,或者分析是否无法识别源与池之间的数据净化步骤。 有关使用 CodeQL分析数据流的信息,请参阅关于数据流分析

要查看有关警报的更多信息,拥有写入权限的用户可单击注释中所示的显示更多详情链接。 这允许您在警报视图中查看工具提供的所有上下文和元数据。 在下例中,您可以查看显示问题的严重性、类型和相关通用缺陷枚举 (CWE) 的标记。 该视图还显示哪个提交引入了问题。

警报页面上的状态和详细信息仅反映存储库默认分支上的警报状态,即使警报存在于其他分支中也是如此。 可以在警报页右侧的“受影响的分支”部分查看非默认分支上的警报状态。 如果默认分支中不存在警报,则警报的状态将显示为“在拉取请求中”或“在分支中”,并将变为灰色。 “开发”部分显示将修复警报的链接分支和拉取请求。****

在警报的详细视图中,某些 code scanning 工具(如 CodeQL 分析)还包括问题说明和一个指导如何修复代码的 显示更多 链接。

显示 code scanning 警报的说明的屏幕截图。 标有“查看更多”的链接以深橙色边框突出显示。

对拉取请求中的警报进行注释

您可以在拉取请求中对任何出现的 code scanning 警报发表评论。 在拉取请求审查过程中,警报以批注形式出现在拉取请求的对话选项卡中,并且显示在已更改的文件选项卡中。

您可以选择要求在拉取请求合并之前解决拉取请求中的所有对话,包括code scanning警报上的对话。 有关详细信息,请参阅“关于受保护分支”。

若要在没有离开 GitHub 的情况下跟踪团队工作流中的修正工作,可以将警报链接到问题。 请参阅“将代码扫描警报链接到 GitHub 议题”。

修复拉取请求上的警报

对拉取请求具有推送访问权限的任何人都可以修复 code scanning 在该拉取请求上标识的警报。 如果将更改提交到拉取请求,这将触发拉取请求检查的新运行。 如果您的更改修复了问题,则警报将被关闭,注释将被删除。

协同处理Copilot自动修复的拉取请求警报建议

          GitHub Copilot自动修复 是 code scanning 的一个扩展,能够为你提供有针对性的建议,以帮助你解决拉取请求中的 code scanning 警报(包括 CodeQL 警报)。 潜在修复是由大型语言模型(LLM)使用来自代码库、拉取请求和 code scanning 分析的数据自动生成的。

注意

无需订阅 GitHub Copilot 即可使用 GitHub Copilot自动修复。 Copilot自动修复 可供 GitHub.com 上的所有公共存储库使用,也可供具备 GitHub Code Security 许可证的组织和企业拥有的内部或私有存储库使用。

拉取请求中 code scanning 警报检查失败的屏幕截图。 “自动修复”建议部分以深橙色框出。

生成 Copilot自动修复 建议并发布到拉取请求

当为存储库启用 Copilot自动修复 时,警报会正常显示在拉取请求中,并且通过 code scanning 发现的警报中的信息会自动发送到 LLM 进行处理。 LLM 分析完成后,任何结果都会发布为相关警报的注释。 有关详细信息,请参阅“负责使用 Copilot 自动修复功能进行代码扫描”。

注意

* Copilot自动修复 支持 CodeQL 查询的子集。 关于 Copilot自动修复 的可用性信息,请参阅从 CodeQL 分析查询 链接的查询表。

  • 分析完成后,所有相关结果将同时发布到拉取请求。 如果拉取请求中至少有一个警报有建议Copilot自动修复,则应认为 LLM 已完成识别出代码的潜在修复方案。
  • 对于由不支持 Copilot自动修复的查询生成的警报,你将看到一条说明,告知你查询不受支持。 如果无法生成对支持的查询的建议,则将看到有关该警报的注释,提示你尝试推送另一个提交或联系支持人员。
          Copilot自动修复 对于 code scanning 警报,无法在每种情况下为每个警报生成修补程序。 该功能会尽力运行,无法保证每次都能 100% 成功。 有关自动生成的修复的限制信息,请参阅“[建议的限制](/code-security/code-scanning/managing-code-scanning-alerts/about-autofix-for-codeql-code-scanning#limitations-of-suggestions)”。

通常,当你建议对拉取请求进行更改时,注释包含对拉取请求中更改的单个文件的更改。 以下屏幕截图显示了一个 Copilot自动修复 注释,该注释建议对 index.js 显示警报的文件进行更改。 由于潜在修复需要 escape-html 上新的依赖项,因此该注释还建议将此依赖项添加到 package.json 文件,即使原始拉取请求对此文件没有进行任何更改。

Copilot自动修复 建议编辑当前文件的屏幕截图。 “package.json”中建议的更改以深橙色框出。

评估和提交 Copilot自动修复 建议

每个 Copilot自动修复 建议展示了解决代码库中 code scanning 警报的潜在方案。 必须评估建议的更改,以确定其是否适合你的代码库,并确保其保持预期行为。 有关Copilot自动修复建议限制的信息,请参阅“负责任地使用”中的Copilot自动修复和code scanning。

  1. 单击“编辑”**** 以显示编辑选项并选择首选方法。
    • 编辑 GitHub CLI 中,按照说明在本地检出拉取请求并实施建议的修补程序。
    • 选择 编辑 FILENAME,在 GitHub 上直接编辑文件,并应用建议的修复。
  2. (可选)如果想要在本地存储库或分支上应用修补程序,请选择 建议上的下拉菜单。
    • 选择“查看自动修复修补”以显示说明,了解如何对任意本地存储库或分支应用建议的修复。
    • 选择复制修改的行 LINE_NUMBER,以复制建议的具体行。
  3. 根据需要测试和修改建议的修复。
  4. 测试完更改后,提交更改并将其推送到分支。
  5. 将更改推送到分支将触发拉取请求的所有常规测试。 确认单元测试仍通过,并且 code scanning 警报现已修复。

拒绝 Copilot自动修复 建议

如果决定拒绝建议 Copilot自动修复 ,请单击批注中的 “消除建议 ”以消除建议的修复。

忽略拉取请求上的警报

关闭警报的另一种办法是忽略它。 您可以忽略您认为不需要修复的警报。 例如,仅用于测试的代码中有错误,或者修复错误的工作超过改进代码的潜在益处。 如果存储库具有写入权限,则会在代码注释和警报摘要中提供 “消除警报 ”按钮。 单击关闭警报时,系统会提示你选择关闭警报的原因。

代码扫描检查失败的屏幕截图。 “关闭警报”按钮以深橙色突出显示。 显示了“关闭警报”下拉列表。

从下拉菜单中选择合适的原因很重要,因为这可能会影响到是否继续将查询纳入未来的分析。 (可选)可对关闭操作进行注释以记录警报关闭操作的上下文。 关闭操作注释将添加到警报时间线,可在审核和报告期间用作理由。 可使用代码扫描 REST API 检索或设置注释。 注释包含在 dismissed_comment 终结点的 alerts/{alert_number} 中。 有关详细信息,请参阅“适用于代码扫描的 REST API 终结点”。

如果将 CodeQL 警报作为误报予以忽略,例如因为代码使用了不受支持的清理库,请考虑参与 CodeQL 存储库并改进分析。 有关 CodeQL 的详细信息,请参阅“参与 CodeQL”。

有关消除警报的详细信息,请参阅“解决代码扫描警报”。