Skip to main content

Сканирование кода CodeQL для скомпилированных языков

Поймите, как CodeQL анализируют скомпилированные языки, какие доступные варианты сборки доступны, и узнайте, как можно настраивать процесс генерации базы данных, если это необходимо.

Кто может использовать эту функцию?

Пользователи с доступом на запись if advanced setup is already enabled

Code scanning доступен для следующих типов репозитория:

  • Общедоступные репозитории для GitHub.com
  • Репозитории, принадлежащие организации, на GitHub Team, GitHub Enterprise Cloud или GitHub Enterprise Server, с включённым GitHub Code Security .

Сравните режимы сборки

Характеристика режима сборкиНетАвтострокаРуководство
Используется по умолчанию для настройки и включения на уровне организацииДа (C/C++, C#, Java и Rust)Да, где none не поддерживаетсяНет
Анализ успешно выполняется без настройки пользователяДаVariableНет
Полнота анализаСозданный код не анализируетсяVariableКонтролируемый пользователем
Точность анализаХорошоХорошоЛучший

Выберите режим строительства

Когда вы настраиваете code scanning его впервые или в нескольких репозиториях, лучше всего использовать стандартную конфигурацию. Настройка по умолчанию использует самый простой способ создания 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-hosted runners в публичных и приватных репозиториях.

Для рабочих процессов расширенной установки кэширование зависимостей по умолчанию отключено. Чтобы включить кэш зависимостей, CodeQLиспользуйте dependency-caching параметр действия CodeQL в вашем расширенном рабочем процессе настройки. Этот параметр принимает следующие значения:

  •         `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

Используйте none режим сборки для CodeQL

Для C/C++, C#, Java и Rust, CodeQL создаёт базу данных без необходимости сборки, когда вы включите настройки по умолчанию , code scanning если только репозиторий не содержит также код Kotlin. Если репозиторий содержит код Kotlin, помимо Java-кода, настройка по умолчанию включена с процессом автосборки, поскольку анализ Kotlin требует сборки.

Создание базы CodeQL данных без сборки может дать менее точные результаты, чем использование autobuild или ручные шаги сборки, если:

  • Скрипты сборки не могут запрашиваться для сведений о зависимостях, а предположения зависимостей являются неточными.
  • Репозиторий обычно создает код во время процесса сборки.

Для использования или ручной сборки можно использовать autobuild расширенную настройку.

Примечание.

Для Java анализа, если build-mode установлен в none и код Kotlin находится в репозитории, код Kotlin не будет проанализирован и будет выпущено предупреждение. См . раздел AUTOTITLE.

Использование autobuild для CodeQL

Действие CodeQL используется autobuild для анализа скомпилированных языков в следующих случаях.

  • Настройка по умолчанию включена, и язык не поддерживает none сборку (поддерживается для C/C++, C#, Java и Rust).
  • Расширенная настройка включена, а рабочий процесс указывает build-mode: 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 }}

Используйте шаг автосборки

    # 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 шаге выполняются программы командной строки с помощью оболочки операционной системы. Вы можете изменить эти команды и добавить дополнительные команды для настройки процесса сборки.

- run: |
    make bootstrap
    make release

Дополнительные сведения о ключевом слове run см. в разделе Синтаксис рабочего процесса для GitHub Actions.

Если вы добавили ручные этапы сборки для скомпилированных языков и code scanning всё равно не работает в вашем репозитории, свяжитесь с .