Skip to main content

Analyse CodeQL pour les langages compilés

Découvrez comment CodeQL analyse les langages compilés, les options de build disponibles et comment vous pouvez personnaliser le processus de génération de base de données si nécessaire.

Qui peut utiliser cette fonctionnalité ?

Utilisateurs avec accès en écriture if advanced setup is already enabled

Code scanning est disponible pour les types de référentiels suivants :

  • Des référentiels publics sur GitHub.com
  • Référentiels appartenant à l’organisation sur GitHub Team, GitHub Enterprise Cloud, ou GitHub Enterprise Server, avec GitHub Code Security activé.

Comparer les modes de compilation

Caractéristique du mode de buildAucunAutobuildManuel
Utilisé par la configuration par défaut et pour l’activation au niveau de l’organisationOui (C/C++, C#, Java et Rust)Oui, lorsque none n’est pas pris en chargeNon
L’analyse aboutit sans configuration utilisateurOuiVariableNon
Exhaustivité de l’analyseLe code généré n’est pas analyséVariableContrôlé par l’utilisateur
Précision de l’analyseBonneBonneLa meilleure

Choisir un mode de génération

Lorsque vous configurez code scanning pour la première fois, ou sur plusieurs dépôts, il est préférable d’utiliser la configuration par défaut. La configuration par défaut utilise la méthode la plus simple disponible pour générer une base de données CodeQL et analyser votre code, afin que vous puissiez commencer à corriger les alertes le plus rapidement possible. Une fois les alertes initiales résolues, vous pourrez envisager de passer à la configuration avancée avec un processus de build manuel pour les dépôts à haut risque.

Pour connaître le comportement spécifique autobuild au langage, les exigences de l’exécuteur et les détails du mode build pour les langues compilées, consultez Options et étapes de génération CodeQL pour les langages compilés.

Utiliser plusieurs modes de génération dans un référentiel multi-langage

Pour les dépôts comportant plusieurs langages compilés, vous pouvez utiliser des modes de build différents selon le langage. Par exemple, si votre référentiel contient C/C++, C# et Java, vous pouvez fournir des étapes de génération manuelles pour un langage (ici C/C++). Ce workflow spécifie un mode de build différent pour chaque langage.

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

Pour des informations sur les langages, bibliothèques et frameworks pris en charge dans la dernière version de CodeQL, consultez Langages et frameworks pris en charge dans la documentation CodeQL. Pour des informations sur la configuration système requise pour exécuter la dernière version de CodeQL, consultez Configuration système requise dans la documentation CodeQL.

Activer la mise en cache des dépendances pour CodeQL

Pour les workflows de configuration par défaut, la mise en cache des dépendances n’est activée que pour les runners hébergés par GitHub dans les dépôts publics et privés.

Pour les workflows de configuration avancée, la mise en cache des dépendances est désactivée par défaut. Pour activer la mise en cache des dépendances pour CodeQL, utilisez le paramètre dependency-caching de l’action CodeQL dans votre workflow de configuration avancée. Ce paramètre accepte les valeurs suivantes :

  •         `false`
            /
            `none`
            /
            `off` : la mise en cache des dépendances est désactivée (par défaut)
    
  •         `restore` : restaurer uniquement les caches existants, ne pas stocker de nouveaux caches
    
  •         `store` : stocker uniquement de nouveaux caches, ne pas restaurer de caches
    
  •         `true`
            /
            `full`
            /
            `on` : restaurer les caches existants et stocker de nouveaux caches
    

Par exemple, les paramètres suivants activeraient la mise en cache des dépendances pour l’action CodeQL :

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

Utiliser le mode de build none pour CodeQL

Pour C/C++, C#, Java et Rust, CodeQL crée une base de données sans nécessiter de build lorsque vous activez la configuration par défaut de code scanning, sauf si le dépôt contient également du code Kotlin. Si un référentiel contient du code Kotlin en plus de Java code, la configuration par défaut est activée avec le processus de génération automatique, car l’analyse Kotlin nécessite une build.

La création d’une base de données CodeQL sans build peut produire des résultats moins précis que l’utilisation du autobuild ou d’étapes de build manuelles si :

  • Les scripts de build ne peuvent pas être interrogés pour obtenir des informations sur les dépendances et les déductions de dépendances sont inexactes.
  • Le dépôt génère normalement du code pendant le processus de build.

Pour utiliser le autobuild ou des étapes de build manuelles, vous pouvez utiliser la configuration avancée.

Remarque

Pour Java analyse, si build-mode a la valeur none et que le code Kotlin se trouve dans le référentiel, le code Kotlin ne sera pas analysé et un avertissement sera généré. Consultez « Options et étapes de génération CodeQL pour les langages compilés ».

Utiliser autobuild pour CodeQL

L’action CodeQL utilise autobuild pour analyser les langages compilés dans les cas suivants :

  • La configuration par défaut est activée et le langage ne prend pas en charge le build none (pris en charge pour C/C++, C#, Java et Rust).
  • La configuration avancée est activée et le workflow spécifie build-mode: autobuild.
  • La configuration avancée est activée et le workflow comporte une étape Autobuild pour le langage utilisant l’action autobuild (github/codeql-action/autobuild@v4).

Utiliser l’option 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 }}

Utiliser l’étape de génération automatique

    # 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

Spécifier manuellement les étapes de génération

Vous ne pouvez spécifier des étapes de build manuelles que si vous avez activé la configuration avancée ; consultez Configuration avancée de l’analyse du code.

En cas d’échec de autobuild ou si vous souhaitez analyser un ensemble différent de fichiers source générés par le processus autobuild, vous devez effectuer les opérations suivantes :

  • Si votre flux de travail spécifie un mode de génération pour la langue, remplacez le mode de génération par manual.
  • Si votre flux de travail contient une étape autobuild, supprimez ou commentez l’étape autobuild dans le flux de travail.

Supprimez ensuite les marques de commentaire de l’étape run et spécifiez manuellement le processus de génération à utiliser. Pour C/C++, C#, Go, Java, Kotlin et Swift, CodeQL analysera le code source construit par les étapes de construction spécifiées.

Mettez à jour votre workflow afin de définir le build-mode sur 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 }}"

Vous pouvez également mettre à jour votre workflow pour commenter l’étape « Autobuild ».

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

Ajouter des commandes de build

Lorsque la compilation manuelle est activée, décommentez l’étape run dans le workflow et ajoutez des commandes de build adaptées à votre dépôt. L’étape run exécute des programmes en ligne de commande à l’aide du shell du système d’exploitation. Vous pouvez modifier ces commandes et ajouter d’autres commandes pour personnaliser le processus de build.

- run: |
    make bootstrap
    make release

Pour plus d’informations sur le mot clé run, consultez « Syntaxe de flux de travail pour GitHub Actions ».

Si vous avez ajouté des étapes de génération manuelles pour les langages compilés et que l’code scanning ne fonctionne toujours pas sur votre dépôt, contactez le nous via le portail de support GitHub.