Skip to main content

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

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

Who can use this feature

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 Advanced Security”。

关于拉取请求上的 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 结果检查

Code scanning 结果检查失败

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

拉取请求上失败的 code scanning 检查

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

其他 code scanning 检查

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

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

与其他拉取请求检查一样,可以在“检查”选项卡上看到检查失败的完整详细信息。有关配置和故障排除的详细信息,请参阅“自定义 code scanning”或“对 CodeQL 工作流进行故障排除”。

查看拉取请求上的警报

通过查看“对话”选项卡,可以看到拉取请求中引入的任何 code scanning 警报。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 中。 有关详细信息,请参阅“代码扫描”。

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

有关消除警报的详细信息,请参阅 “管理存储库的 code scanning 警报”。