跳至主要内容

针对编译语言的 CodeQL 代码扫描

了解 CodeQL 如何分析编译语言、可用的构建选项,并学习在需要时如何自定义数据库生成过程。

谁可以使用此功能?

如果已启用高级设置,则具有 写入 权限的用户

以下仓库类型可使用代码扫描

  • GitHub.com 上的公共仓库
  • 在 GitHub Team、GitHub Enterprise Cloud 或 GitHub Enterprise Server 上的组织拥有的仓库,已启用 GitHub 代码安全

比较构建模式

构建模式特性自动构建手册
默认设置以及组织级启用时使用是(C/C++、C#、Java 和 Rust)是,当 none 不受支持时
分析在无需用户配置的情况下成功变量
分析的完整性未分析生成的代码变量用户控制
分析的准确性良好良好最佳

选择构建模式

当您首次设置代码扫描,或在多个仓库之间进行设置时,最好使用默认设置。默认设置使用可用的最简方法生成 CodeQL 数据库并分析您的代码,以便您能够尽快开始修复警报。在解决了初始警报后,您可能希望为高风险仓库切换到使用手动构建过程的高级设置。

有关特定语言的 autobuild 行为、运行程序要求以及编译语言的构建模式详情,请参阅 编译语言的 CodeQL 构建选项和步骤

在多语言仓库中使用多种构建模式

对于包含多种编译语言的仓库,您可以为不同语言使用不同的构建模式。例如,如果您的仓库包含 C/C++、C# 和 Java,您可能希望为某种语言(此处为 C/C++)提供手动构建步骤。此工作流为每种语言指定了不同的构建模式。

strategy:
  matrix:
    include:
      # Analyzes C and C++ code using the commands in `Build C and C++ code`
      - language: c-cpp
        build-mode: manual
      # Analyzes C# code by automatically detecting a build
      - language: csharp
        build-mode: autobuild
      # Analyzes Java code directly from the codebase without a build
      - language: java-kotlin
        build-mode: none # analyzes Java only
steps:
- name: Checkout repository
  uses: actions/checkout@v5

# Initializes CodeQL tools and creates a codebase for analysis.
- name: Initialize CodeQL
  uses: github/codeql-action/init@v4
  with:
    languages: ${{ matrix.language }}
- if: ${{ matrix.build-mode == 'manual' }}
  name: Build C and C++ code
  run: |
    echo 'If you are using a "manual" build mode for one or more of the' \
      'languages you are analyzing, replace this with the commands to build' \
      'your code, for example:'
    echo ' make bootstrap'
    echo ' make release'
    exit 1

有关在最新版本的 CodeQL 中支持的语言、库和框架的信息,请参阅 CodeQL 文档中的受支持的语言和框架。有关运行最新版本 CodeQL 的系统要求,请参阅 CodeQL 文档中的系统要求

为 CodeQL 启用依赖缓存

对于默认设置工作流,仅在 GitHub 托管的运行程序上且在公共和私有仓库中启用依赖缓存。

对于高级设置工作流,默认情况下禁用依赖缓存。要为 CodeQL 启用依赖缓存,请在高级设置工作流中对 CodeQL 操作使用 dependency-caching 设置。此设置接受以下值:

  • false/none/off:禁用依赖缓存(默认)
  • restore:仅恢复已有缓存,不存储新缓存
  • store:仅存储新缓存,不恢复已有缓存
  • true/full/on:恢复已有缓存并存储新缓存

例如,以下设置将为 CodeQL 操作启用依赖缓存

    # Initializes CodeQL with dependency caching enabled
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v4
      with:
        languages: java
        dependency-caching: true

为 CodeQL 使用 none 构建模式

对于 C/C++、C#、Java 和 Rust,除非仓库中还包含 Kotlin 代码,否则在为代码扫描启用默认设置时,CodeQL 会在不需要构建的情况下创建数据库。如果仓库在 Java 代码之外还包含 Kotlin 代码,则默认设置将使用自动构建过程启用,因为 Kotlin 分析需要构建。

如果在没有构建的情况下创建 CodeQL 数据库,可能会导致结果的准确性低于使用 autobuild 或手动构建步骤的情况,具体如下:

  • 构建脚本无法查询依赖信息,且依赖猜测不准确。
  • 仓库通常在构建过程中生成代码。

要使用 autobuild 或手动构建步骤,您可以使用高级设置。

注意

对于 Java 分析,如果 build-mode 设置为 none 且仓库中发现 Kotlin 代码,则 Kotlin 代码将不被分析并产生警告。请参阅 编译语言的 CodeQL 构建选项和步骤

为 CodeQL 使用 autobuild

CodeQL 操作在以下情况下使用 autobuild 分析编译语言。

  • 默认设置已启用且该语言不支持 none 构建(支持 C/C++、C#、Java 和 Rust)。
  • 已启用高级设置且工作流指定了 build-mode: autobuild
  • 已启用高级设置且工作流为该语言使用了 autobuild 操作的 Autobuild 步骤(github/codeql-action/autobuild@v4)。

使用 build-mode 选项

# Initializes the CodeQL tools for scanning.
name: Analyze
strategy:
  matrix:
    include:
      # Analyze C and C++ code
      - language: c-cpp
        build-mode: autobuild
      # Analyze Go code
      - language: go
        build-mode: autobuild

steps:
  - uses: github/codeql-action/init@v4
    with:
      languages: ${{ matrix.language }}
      build-mode: ${{ matrix.build-mode }}

使用 Autobuild 步骤

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v4
      with:
        languages: ${{ matrix.language }}

    - name: Autobuild
      uses: github/codeql-action/autobuild@v4

手动指定构建步骤

仅当您已启用高级设置时才能手动指定构建步骤,请参阅 代码扫描的高级设置配置

如果 autobuild 失败,或您希望分析与 autobuild 过程构建的源文件不同的一组源文件,则需要执行以下操作

  • 如果您的工作流为该语言指定了构建模式,请将构建模式更改为 manual
  • 如果您的工作流包含 autobuild 步骤,请在工作流中删除或注释掉该 autobuild 步骤。

然后取消注释 run 步骤,并手动指定要使用的构建过程。对于 C/C++、C#、Go、Java、Kotlin 和 Swift,CodeQL 将分析您指定的构建步骤所生成的任何源代码。

更新工作流,将 build-mode 定义为 manual

# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v4
  with:
    languages: ${{ matrix.language }}
    build-mode: manual
- uses: github/codeql-action/analyze@v4
  with:
    category: "/language:${{ matrix.language }}"

或者,更新工作流,注释掉 “Autobuild” 步骤。

    # Autobuild attempts to build any compiled languages.
    # - name: Autobuild
    #  uses: github/codeql-action/autobuild@v4

添加构建命令

启用手动构建后,取消注释工作流中的 run 步骤,并添加适合您仓库的构建命令。run 步骤使用操作系统的 shell 运行命令行程序。您可以修改这些命令并添加更多命令以自定义构建过程。

- run: |
    make bootstrap
    make release

有关 run 关键字的更多信息,请参阅 GitHub Actions 工作流语法

如果您为编译语言添加了手动构建步骤,但代码扫描仍无法在您的仓库中正常工作,请通过 GitHub 支持门户 与我们联系。

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