Remarque : Cet article a été migré à partir du site web de documentation CodeQL en janvier 2023.
À propos de l’analyse des bases de données avec CodeQL CLI
Remarque : cet article décrit les fonctionnalités disponibles avec l’offre groupée CodeQL CLI 2.7.6 incluse dans la mise en production initiale de GitHub Enterprise Server 3.4.
Si votre administrateur de site a mis à jour votre versionCodeQL CLI vers une version plus récente, consultez la version GitHub Enterprise Cloud de cet article pour obtenir plus d’informations sur les dernières fonctionnalités.
Pour analyser un codebase, vous exécutez des requêtes sur une base de données CodeQL extraite du code.
Les analyses CodeQL produisent des résultats interprétés qui peuvent être affichés sous forme d’alertes ou de chemins dans le code source.
Pour plus d’informations sur l’écriture de requêtes à exécuter avec database analyze
, consultez « Utilisation de requêtes personnalisées avec CodeQL CLI ».
Autres commandes d’exécution de requête
Les requêtes exécutées avec database analyze
ont des exigences de métadonnées strictes. Vous pouvez également exécuter des requêtes à l’aide des sous-commandes de niveau plomberie suivantes :
-
database run-queries
, qui génère des résultats non interprétés dans un format binaire intermédiaire appelé BQRS. -
query run
, qui génère des fichiers BQRS ou imprime les tables de résultats directement dans la ligne de commande. L’affichage des résultats directement dans la ligne de commande peut être utile pour le développement de requêtes itératives à l’aide de l’interface CLI.
Les requêtes exécutées avec ces commandes n’ont pas les mêmes exigences de métadonnées.
Toutefois, pour enregistrer des données lisibles par l’homme, vous devez traiter chaque fichier de résultats BQRS à l’aide de la sous-commande de plomberie bqrs decode
. C’est pourquoi, dans la plupart des cas d’usage, il est plus simple d’utiliser database analyze
pour générer directement des résultats interprétés.
Avant de commencer une analyse, vous devez :
- Configurer CodeQL CLI pour exécuter des commandes localement.
- Créer une base de données CodeQL pour le code source que vous souhaitez analyser.
Le moyen le plus simple d’exécuter codeql database analyze
consiste à utiliser des packs CodeQL. Vous pouvez également exécuter la commande à l’aide de requêtes à partir d’une extraction locale du dépôt CodeQL, ce que vous voudrez peut-être faire si vous souhaitez personnaliser les principales requêtes CodeQL.
En cours d’exécution codeql database analyze
Lorsque la commande database analyze
est exécutée, elle :
- Télécharge éventuellement tous les packages CodeQL référencés qui ne sont pas disponibles localement.
- Exécute un ou plusieurs fichiers de requête en les exécutant sur une base de données CodeQL.
- Interprète les résultats, sur la base de certaines métadonnées de requête, afin que les alertes puissent être affichées au bon endroit dans le code source.
- Signale les résultats de toutes les requêtes de diagnostic et de synthèse à la sortie standard.
Vous pouvez analyser une base de données en exécutant la commande suivante :
codeql database analyze <database> --format=<format> --output=<output> <query-specifiers>...
Vous devez spécifier :
<database>
: chemin de la base de données CodeQL que vous souhaitez analyser.--format
: format du fichier de résultats généré pendant l’analyse. Un certain nombre de formats différents sont pris en charge, notamment les formats CSV, SARIF et graphique. Pour plus d’informations sur CSV et SARIF, consultez Résultats. Pour savoir quels autres formats de résultats sont pris en charge, consultez les informations de référence sur l’analyse de bases de données.--output
: chemin de sortie du fichier de résultats généré pendant l’analyse.
Vous pouvez également spécifier :
-
<query-specifiers>...
: liste séparée par un espace des requêtes à exécuter sur votre base de données. Il s’agit d’une liste d’arguments, où chaque argument peut être :- un chemin vers un fichier de requête
- un chemin vers un répertoire contenant des fichiers de requête
- un chemin vers un fichier de suite de requêtes
- le nom d’un pack de requêtes CodeQL
- avec une plage de versions facultative
- avec un chemin facultatif vers une requête, un répertoire ou une suite de requêtes à l’intérieur du pack
En cas d’omission, la suite de requêtes par défaut pour le langage de la base de données analysée est utilisée. Pour obtenir la syntaxe complète des spécificateurs de requêtes, consultez « Spécification des requêtes à exécuter dans un pack CodeQL ».
-
--sarif-category
: catégorie d’identification pour les résultats. Utilisée lorsque vous souhaitez charger plusieurs jeux de résultats pour un commit. Par exemple, lorsque vous utilisezgithub upload-results
pour envoyer des résultats pour plusieurs langages à l’API d’analyse du code GitHub. Pour plus d’informations sur ce cas d’usage, consultez Configuration de CodeQL CLI dans votre système CI. -
--sarif-add-query-help
: (pris en charge dans les versions 2.7.1 et ultérieures) ajoute toute aide aux requêtes personnalisées écrite au format Markdown dans les fichiers SARIF (v2.1.0 ou ultérieur) générés par l’analyse. L’aide aux requêtes stockée dans les fichiers.qhelp
doit être convertie au format.md
avant d’exécuter l’analyse. Pour plus d’informations, consultez « Inclusion d’une aide aux requêtes pour les requêtes CodeQL personnalisées dans les fichiers SARIF ». -
--download
: indicateur booléen qui permet à l’interface CLI de télécharger tous les packages CodeQL référencés qui ne sont pas disponibles localement. Si cet indicateur n’est pas présent et qu’un package CodeQL référencé n’est pas disponible localement, la commande échoue.
Mise à niveau des bases de données
Pour les bases de données créées par CodeQL CLI version 2.3.3 ou antérieure, vous devez les mettre à niveau explicitement avant de pouvoir exécuter une analyse avec une version plus récente de CodeQL CLI. Si cette étape est nécessaire, vous verrez un message vous indiquant que votre base de données doit être mise à niveau lorsque vous exécutez database analyze
.
Pour les bases de données créées par CodeQL CLI version 2.3.4 ou ultérieure, l’interface CLI exécute implicitement les mises à niveau requises. L’exécution explicite de la commande de mise à niveau n’est pas nécessaire.
Pour des détails complets sur toutes les options que vous pouvez utiliser lors de l’analyse des bases de données, consultez la documentation de référence sur database analyze.
Spécification des requêtes à exécuter dans un pack CodeQL
Les spécificateurs de requêtes sont utilisés par codeql database analyze
et d’autres commandes qui opèrent sur un ensemble de requêtes.
La forme complète d’un spécificateur de requête est scope/name@range:path
, où :
-
scope/name
est le nom qualifié d’un pack CodeQL. -
range
est une plage semver. -
path
est un chemin de système de fichiers vers une requête unique, un répertoire contenant des requêtes ou un fichier de suite de requêtes.
Lorsque vous spécifiez un scope/name
, range
et path
sont facultatifs. Si vous omettez une range
, la dernière version du pack spécifié est utilisée. Si vous omettez un path
, la suite de requêtes par défaut du pack spécifié est utilisée.
path
peut être au choix : un fichier de requête .ql
, un répertoire contenant une ou plusieurs requêtes ou un fichier de suite de requêtes .qls
. Si vous omettez un nom de pack, vous devez fournir un path
, qui sera interprété en fonction du répertoire de travail du processus en cours. Les modèles glob ne sont pas pris en charge.
Si vous spécifiez à la fois un scope/name
et un path
, le path
ne peut pas être absolu. Il est considéré comme relatif à la racine du pack CodeQL.
Exemples de spécificateurs de requêtes
-
codeql/python-queries
- Toutes les requêtes de la suite de requêtes par défaut de la dernière version du packcodeql/python-queries
. -
codeql/python-queries@1.2.3
- Toutes les requêtes de la suite de requêtes par défaut de la version1.2.3
du packcodeql/python-queries
. -
codeql/python-queries@~1.2.3
- Toutes les requêtes de la suite de requêtes par défaut de la dernière version du packcodeql/python-queries
qui est >=1.2.3
et <1.3.0
. -
codeql/python-queries:Functions
- Toutes les requêtes du répertoireFunctions
dans la dernière version du packcodeql/python-queries
. -
codeql/python-queries@1.2.3:Functions
- Toutes les requêtes du répertoireFunctions
dans la version 1.2.3 du packcodeql/python-queries
. -
codeql/python-queries@1.2.3:codeql-suites/python-code-scanning.qls
- Toutes les requêtes du répertoirecodeql-suites/python-code-scanning.qls
dans la version 1.2.3 du packcodeql/python-queries
. -
suites/my-suite.qls
- Toutes les requêtes du fichiersuites/my-suite.qls
relatives au répertoire de travail actuel.
Conseil
La suite de requêtes par défaut des packs de requêtes standard CodeQL est codeql-suites/<lang>-code-scanning.qls
. Vous trouverez également plusieurs autres suites de requêtes utiles dans le répertoire codeql-suites
de chaque pack. Par exemple, le pack codeql/cpp-queries
contient les suites de requêtes suivantes :
-
cpp-code-scanning.qls
- Requêtes d’analyse de code standard pour C++. Suite de requêtes par défaut pour ce pack. -
cpp-security-extended.qls
- Requêtes de la suitecpp-code-scanning.qls
par défaut pour C++, plus des requêtes de gravité et de précision moindres. -
cpp-security-and-quality.qls
- Requêtes decpp-security-extended.qls
, plus des requêtes de maintenabilité et de fiabilité.
Vous pouvez voir les sources de ces suites de requêtes dans le dépôt CodeQL. Les suites de requêtes pour les autres langages sont similaires.
Exemples d’exécution d’analyses de bases de données
Les exemples suivants montrent comment exécuter database analyze
avec les packs CodeQL et comment utiliser une extraction locale du dépôt CodeQL. Ces exemples supposent que vos bases de données CodeQL ont été créées dans un répertoire qui est un frère de vos copies locales du dépôt CodeQL.
Exécution d’une requête unique
Pour exécuter une requête unique sur une base de données CodeQL pour un codebase JavaScript, vous pouvez utiliser la commande suivante à partir du répertoire contenant votre base de données :
codeql database analyze --download <javascript-database> codeql/javascript-queries:Declarations/UnusedVariable.ql --format=csv --output=js-analysis/js-results.csv
Cette commande exécute une requête simple qui trouve les bogues potentiels relatifs à des variables, importations, fonctions ou classes inutilisées. Il s’agit de l’une des requêtes JavaScript incluses dans le dépôt CodeQL. Vous pouvez exécuter plusieurs requêtes en spécifiant une liste de chemins similaires séparés par des espaces.
L’analyse génère un fichier CSV (js-results.csv
) dans un nouveau répertoire (js-analysis
).
Sinon, si vous avez extrait le dépôt CodeQL, vous pouvez exécuter les mêmes requêtes en spécifiant directement le chemin de la requête :
codeql database analyze <javascript-database> ../ql/javascript/ql/src/Declarations/UnusedVariable.ql --format=csv --output=js-analysis/js-results.csv
Vous pouvez également exécuter vos propres requêtes personnalisées avec la commande database analyze
.
Pour plus d’informations sur la préparation de vos requêtes à utiliser avec CodeQL CLI, consultez « Utilisation de requêtes personnalisées avec CodeQL CLI ».
Exécution de toutes les requêtes dans un répertoire
Vous pouvez exécuter toutes les requêtes d’un répertoire en fournissant le chemin du répertoire, au lieu de lister tous les fichiers de requêtes individuels. Les chemins étant recherchés de manière récursive, toutes les requêtes contenues dans les sous-dossiers seront également exécutées.
Important
Vous devez éviter de spécifier la racine d’un pack de requêtes CodeQL principales lors de l’exécution de database analyze
, car il risque de contenir des requêtes spéciales qui ne sont pas conçues pour être utilisées avec la commande. Au lieu de cela, exécutez le pack de requêtes pour inclure les requêtes par défaut du pack dans l’analyse, ou exécutez l’une des suites de requêtes d’analyse du code.
Par exemple, pour exécuter toutes les requêtes Python contenues dans le répertoire Functions
du pack de requêtes codeql/python-queries
, vous devez exécuter :
codeql database analyze <python-database> codeql/python-queries:Functions --format=sarif-latest --output=python-analysis/python-results.sarif --download
Sinon, si vous avez extrait le dépôt CodeQL, vous pouvez exécuter les mêmes requêtes en spécifiant directement le chemin du répertoire :
codeql database analyze <python-database> ../ql/python/ql/src/Functions/ --format=sarif-latest --output=python-analysis/python-results.sarif
Une fois l’analyse terminée, un fichier de résultats SARIF est généré. Spécifier --format=sarif-latest
garantit que les résultats sont mis en forme selon la spécification SARIF la plus récente prise en charge par CodeQL.
Exécution de suites de requêtes
Pour exécuter une suite de requêtes sur une base de données CodeQL pour un codebase C/C++, vous pouvez utiliser la commande suivante à partir du répertoire contenant votre base de données :
codeql database analyze <cpp-database> codeql/cpp-queries:codeql-suites/cpp-code-scanning.qls --format=sarifv2.1.0 --output=cpp-results.sarif --download
Cette commande télécharge le pack de requêtes codeql/cpp-queries
CodeQL, exécute l’analyse et génère un fichier au format SARIF version 2.1.0 qui est pris en charge par toutes les versions de GitHub. Ce fichier peut être chargé dans GitHub en exécutant codeql github upload-results
ou l’API d’analyse du code.
Pour plus d’informations, consultez « Configuration de l’interface CLI de CodeQL dans votre système CI » ou « Analyse du code ».
Les suites de requêtes CodeQL sont des fichiers .qls
qui utilisent des directives pour sélectionner des requêtes à exécuter selon certaines propriétés de métadonnées. Les packs CodeQL standard ont des métadonnées qui spécifient l’emplacement des suites de requêtes utilisées par l’analyse du code. Ainsi, CodeQL CLI sait où trouver ces fichiers de suite automatiquement, et vous n’avez pas à spécifier le chemin complet sur la ligne de commande.
Pour plus d’informations, consultez « Création de suites de requêtes CodeQL ».
Pour des informations sur la création de suites de requêtes personnalisées, consultez « Création de suites de requêtes CodeQL ».
Informations de diagnostic et de synthèse
Lorsque vous créez une base de données CodeQL, l’extracteur stocke les données de diagnostic dans la base de données. Les suites de requêtes d’analyse du code incluent des requêtes supplémentaires pour reporter sur ces données de diagnostic et calculer des métriques récapitulatives. Une fois la commande database analyze
terminée, l’interface CLI génère le fichier de résultats et reporte toute donnée de diagnostic et de synthèse dans la sortie standard. Si vous choisissez de générer une sortie SARIF, les données supplémentaires sont également incluses dans le fichier SARIF.
Si l’analyse a trouvé moins de résultats pour les requêtes standard que prévu, passez en revue les résultats des requêtes de diagnostic et de synthèse pour vérifier si la base de données CodeQL est susceptible d’être une bonne représentation du codebase que vous souhaitez analyser.
Intégration d’un pack CodeQL dans un workflow d’analyse du code dans GitHub
Vous pouvez utiliser des packs de requêtes CodeQL dans votre configuration d’analyse du code. Cela vous permet de sélectionner des packs de requêtes publiés par différentes sources et de les utiliser pour analyser votre code. Pour plus d’informations, consultez « Utilisation des packs de requêtes CodeQL dans l’action CodeQL » ou « Téléchargement et utilisation de packs de requêtes CodeQL dans votre système CI ».
Inclusion d’une aide aux requêtes pour les requêtes CodeQL personnalisées dans les fichiers SARIF
Si vous utilisez CodeQL CLI pour exécuter des analyses de code sur des systèmes CI/CD tiers, vous pouvez inclure l’aide aux requêtes pour vos requêtes personnalisées dans les fichiers SARIF générés lors d’une analyse. Après avoir chargé le fichier SARIF dans GitHub, l’aide aux requêtes s’affiche dans l’interface utilisateur de l’analyse du code pour toutes les alertes générées par les requêtes personnalisées.
À partir de CodeQL CLI version 2.7.1 et ultérieure, vous pouvez inclure l’aide aux requêtes restituée au format Markdown dans les fichiers SARIF en fournissant l’option --sarif-add-query-help
lors de l’exécution de codeql database analyze
.
Pour plus d’informations, consultez Configuration de CodeQL CLI dans votre système CI.
Vous pouvez écrire une aide aux requêtes pour les requêtes personnalisées directement dans un fichier Markdown et l’enregistrer en même temps que la requête correspondante. Par souci de cohérence avec les requêtes CodeQL standard, vous pouvez aussi écrire une aide aux requêtes au format .qhelp
. L’aide aux requêtes écrite dans les fichiers .qhelp
ne peut pas être incluse dans les fichiers SARIF et ne peut pas être traitée par l’analyse du code, elle doit par conséquent être convertie au format Markdown avant d’exécuter l’analyse. Pour plus d’informations, consultez « Fichiers d’aide aux requêtes » et « Test des fichiers d’aide aux requêtes ».
Résultats
Vous pouvez enregistrer les résultats d’analyse dans différents formats, notamment SARIF et CSV.
Le format SARIF est conçu pour représenter la sortie d’un large éventail d’outils d’analyse statique. Pour plus d’informations, consultez Sortie SARIF.
Si vous choisissez de générer des résultats au format CSV, chaque ligne du fichier de sortie correspond à une alerte. Chaque ligne est une liste séparée par des virgules avec les informations suivantes.
Propriété | Description | Exemple |
---|---|---|
Nom | Nom de la requête qui a identifié le résultat. | Inefficient regular expression |
Description | Description de la requête. | A regular expression that requires exponential time to match certain inputs can be a performance bottleneck, and may be vulnerable to denial-of-service attacks. |
severity | Gravité de la requête. | error |
Message | Message d’alerte. | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of '\\\\'. |
Path | Chemin du fichier contenant l’alerte. | /vendor/codemirror/markdown.js |
Ligne de début | Ligne du fichier où commence le code qui a déclenché l’alerte. | 617 |
Colonne de début | Colonne de la ligne de début qui marque le début du code d’alerte. Non incluse si égal à 1. | 32 |
Ligne de fin | Ligne du fichier où finit le code qui a déclenché l’alerte. Non incluse lorsqu’elle a la même valeur que la ligne de début. | 64 |
Colonne de fin | Lorsqu’elle est disponible, colonne de la ligne de fin qui marque la fin du code d’alerte. Sinon, la ligne de fin est répétée. | 617 |
Les fichiers de résultats peuvent être intégrés à votre propre infrastructure de revue ou de débogage du code. Par exemple, la sortie du fichier SARIF peut être utilisée pour mettre en évidence des alertes au bon endroit dans votre code source à l’aide d’un plug-in de visionneuse SARIF pour votre IDE.