Skip to main content

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

当 code scanning 在拉取请求中发现问题时,您可以审查高亮的代码并解决警报。

谁可以使用此功能?

If you have read permission for a repository, you can see annotations on pull requests. With write permission, you can see detailed information and resolve code scanning alerts for that repository.

Code scanning 可用于 GitHub.com 上的所有公共存储库。 Code scanning 也可用于使用 GitHub Enterprise Cloud 并拥有 GitHub Advanced Security 许可证的组织所拥有的专用存储库。 有关详细信息,请参阅“关于 GitHub 高级安全性”。

关于拉取请求上的 code scanning 结果

在仓库中,如果 code scanning 被配置为拉取请求检查,则 code scanning 将检查拉取请求中的代码。 默认情况下,这仅限于针对默认分支的拉取请求,但是您可以在 GitHub Actions 或第三方 CI/CD 系统中更改此配置。 如果拉取请求中更改的代码行生成 code scanning 警报,则会在拉取请求上的以下位置报告警报。

  • 检查拉取请求 中的结果
  • 拉取请求的“对话”选项卡是拉取请求审查的一部分
  • 拉取请求的“已更改的文件”选项卡

如果你拥有存储库的写入权限,可以在“安全性”选项卡上看到任何现有的 code scanning 警报。有关存储库警报的信息,请参阅“管理存储库的代码扫描警报”。

在 code scanning 配置为在每次推送代码时扫描的存储库中,code scanning 还会将结果映射到任何打开的拉取请求,并将警报作为注释添加到与其他拉取请求检查相同的位置。 有关详细信息,请参阅“自定义 代码扫描的高级设置”。

如果拉取请求针对使用 code scanning 的受保护分支,并且存储库所有者已配置所需的状态检查,则“Code scanning 结果”检查必须先通过,然后才能合并拉取请求。 有关详细信息,请参阅“关于受保护分支”。

关于 code scanning 作为拉取请求检查

有许多选项可将 code scanning 配置为拉取请求检查,因此每个存储库的确切配置会有所不同,有些存储库还会有多个检查。

Code scanning 结果检查

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

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

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

Code scanning 结果检查失败

如果 code scanning 结果检查发现严重性为 error``criticalhigh 的问题,检查将失败并在检查结果中报告错误。 如果 code scanning 发现的所有结果的严重性都较低,则警报将被视为警告或通知,检查成功。

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

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

其他 code scanning 检查

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

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

与其他拉取请求检查一样,你可以在“检查”选项卡上查看检查失败的完整详细信息。有关配置和故障排除的详细信息,请参阅“自定义 代码扫描的高级设置”或“代码扫描疑难解答”。

查看拉取请求上的警报

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

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

您还可以查看所有 code scanning 警报 ,这些警报位于拉取请求的“文件已更改”选项卡。

如果在拉取请求中添加了新的代码扫描配置,则会在拉取请求上看到一条注释,该注释会将你定向到存储库的“安全”选项卡,以便你查看拉取请求分支上的所有警报。 有关查看存储库警报的详细信息,请参阅“管理存储库的代码扫描警报”。

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

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

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

在警报的详细视图中,有些 code scanning 工具(例如 CodeQL 分析)还包括问题描述和“显示更多”链接以指导你如何修复代码。

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

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

可以对拉取请求上出现的任何 code scanning 警报 进行注释。 警报在拉取请求的“对话”选项卡中显示为注释,作为拉取请求审查的一部分,也显示在“已更改的文件”选项卡中。

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

修复拉取请求上的警报

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

忽略拉取请求上的警报

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

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

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

有关消除警报的详细信息,请参阅“管理存储库的代码扫描警报”。