Skip to main content

Sortie SARIF dans l’interface CLI de CodeQL

Vous pouvez générer une sortie SARIF à partir de CodeQL CLI et partager des résultats d’analyse statique avec d’autres systèmes.

Qui peut utiliser cette fonctionnalité ?

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

À propos de la sortie SARIF

Le format SARIF est conçu pour représenter la sortie d’un large éventail d’outils d’analyse statique et il existe de nombreuses fonctionnalités dans la spécification SARIF considérées comme « facultatives ». Ce document décrit la sortie produite lors de l’utilisation du type de format sarifv2.1.0, qui correspond à la spécification SARIF v2.1.0.csd1. Pour plus d’informations sur la sélection d’un format de fichier pour vos résultats d’analyse, consultez « database analyze ».

Spécification et schéma SARIF

Cet article est destiné à être lu de concert avec la spécification SARIF détaillée. Pour plus d’informations sur la spécification et le schéma SARIF, consultez la documentation sur la spécification SARIF.

Notes sur les modifications

Modifications entre les versions

Version CodeQLType de formatModifications
2.0.0sarifv2.1.0Première version de ce format.

Modifications à venir de la sortie

La sortie produite pour un type de format spécifique donné (par exemple, sarifv2.1.0) est susceptible d’être modifiée dans les versions ultérieures de CodeQL. Nous nous efforcerons de maintenir la compatibilité descendante avec les consommateurs de la sortie SARIF générée en veillant à ceci :

  • Les champs marqués comme toujours générés ne seront jamais supprimés.

  • Pour les champs marqués comme n’étant pas toujours générés, les circonstances dans lesquelles les champs sont générés peuvent changer. Les consommateurs de la sortie SARIF CodeQL devraient résister à la présence ou à l’absence de ces champs.

De nouveaux champs de sortie pourront être ajoutés dans les versions ultérieures sous le même type de format : ils ne seront pas considérés comme antagonistes à la compatibilité descendante, et les consommateurs devraient résister à la présence de champs nouvellement ajoutés.

De nouveaux types d’arguments de format pourront être ajoutés dans les versions à venir de CodeQL, par exemple pour prendre en charge les nouvelles versions de SARIF. Ces types n’offrent aucune garantie de compatibilité descendante, sauf indication explicite contraire.

Objets SARIF générés

Voici des informations détaillées sur chaque composant SARIF susceptible d’être généré, ainsi que toutes les éventuelles circonstances spécifiques. Nous omettons toutes les propriétés qui ne sont jamais générées.

l'objet sarifLog

Nom de la propriété JSONToujours généré ?Remarques
$schemaFournit un lien vers le schéma SARIF.
versionVersion du format SARIF utilisé pour générer la sortie.
runsTableau contenant un objet d’exécution unique, pour un seul langage.

l'objet run

Nom de la propriété JSONToujours généré ?Remarques
toolNone
artifactsTableau contenant au moins un objet d’artefact pour chaque fichier référencé dans un résultat.
resultsNone
newLineSequencesNone
columnKindNone
propertiesLe dictionnaire des propriétés contient le semmle.formatSpecifier, qui identifie le spécificateur de format passé à l’CodeQL CLI.

l'objet tool

Nom de la propriété JSONToujours généré ?Remarques
driverNone

l'objet toolComponent

Nom de la propriété JSONToujours généré ?Remarques
nameDéfinissez ce nom sur « Chaîne d’outils en ligne de commande CodeQL » pour une sortie provenant des outils CodeQL CLI. Notez que si la sortie a été générée à l’aide d’un autre outil, une autre propriété name est signalée et le format risque de ne pas être celui décrit ici.
organizationDéfinissez cette propriété sur « GitHub ».
versionDéfinissez cette propriété sur la version de CodeQL, par exemple « 2.0.0 ».
rulesTableau d’objets reportingDescriptor qui représentent des règles. Ce tableau contient au minimum toutes les règles exécutées pendant cette analyse, mais il peut contenir des règles qui étaient disponibles et qui n’ont pas été exécutées. Pour plus d’informations sur l’activation des requêtes, consultez defaultConfiguration.

Objet reportingDescriptor (pour une règle)

Des objets reportingDescriptor peuvent être utilisés à plusieurs endroits dans la spécification SARIF. Quand un reportingDescriptor est inclus dans le tableau de règles d’un objet toolComponent, ses propriétés sont les suivantes.

Nom de la propriété JSONToujours généré ?Remarques
idContient la propriété @id spécifiée dans la requête qui définit la règle, dont le format est généralement language/rule-name (par exemple cpp/unsafe-format-string). Si votre organisation définit la propriété @opaqueid dans la requête, celle-ci est utilisée à la place.
nameContient la propriété @idspécifiée dans la requête. Pour obtenir un exemple, consultez la propriété id ci-dessus.
shortDescriptionContient la propriété @name spécifiée dans la requête qui définit la règle.
fullDescriptionContient la propriété @description spécifiée dans la requête qui définit la règle.
defaultConfigurationObjet reportingConfiguration, dont la propriété activée est définie sur true ou false et dont une propriété de niveau est définie en fonction de la propriété @severity spécifiée dans la requête qui définit la règle. Omis si la propriété @severity n’a pas été spécifiée.

l'objet artifact

Nom de la propriété JSONToujours généré ?Remarques
locationObjet artifactLocation.
indexIndex de l'objet artifact.
contentsSi les résultats sont générés à l’aide de l’indicateur --sarif-add-file-contents et que le code source est disponible au moment de la génération du fichier SARIF, alors la propriété contents est renseignée avec un objet artifactContent et avec la propriété text définie.

l'objet artifactLocation

Nom de la propriété JSONToujours généré ?Remarques
uriNone
indexNone
uriBaseIdSi le fichier est lié à un emplacement abstrait connu, comme l’emplacement source racine sur la machine d’analyse, alors cette propriété est définie.

l'objet result

La composition des résultats dépend des options fournies à CodeQL. Par défaut, les résultats sont regroupés par chaîne de format de message unique et par emplacement principal. Ainsi, deux résultats qui se produisent au même emplacement avec le même message sous-jacent apparaissent sous la forme d’un résultat unique dans la sortie. Ce comportement peut être désactivé à l’aide de l’indicateur --ungroup-results, auquel cas aucun résultat n’est regroupé.

Nom de la propriété JSONToujours généré ?Remarques
ruleIdConsultez la description de la propriété id dans l’objet reportingDescriptor (pour la règle).
ruleIndexNone
messageMessage décrivant le ou les problèmes qui se produisent à cet emplacement. Ce message peut être un « message avec espace réservé » au format SARIF, contenant des liens qui font référence à des emplacements dans la propriété relatedLocations.
locationsTableau contenant un objet location unique.
partialFingerprintsIl existe un dictionnaire des types d’empreintes digitales nommées. Celui-ci contient, au minimum, une valeur pour primaryLocationLineHash, qui fournit une empreinte digitale selon le contexte de l’emplacement principal.
codeFlowsCe tableau peut être renseigné avec un ou plusieurs objets codeFlow si la requête qui définit la règle pour ce résultat est de @kind path-problem.
relatedLocationsCe tableau est renseigné si la requête qui définit la règle pour ce résultat a un message avec des options d’espace réservé. Chaque emplacement unique est inclus une seule fois.
suppressionsSi le résultat est supprimé, alors il contient un seul objet suppression, avec la propriété @kind définie sur IN_SOURCE. Si ce résultat n’est pas supprimé, mais qu’au moins un résultat fait l’objet d’une suppression, alors il est défini sur un tableau vide ; sinon, il n’est pas défini.

l'objet location

Nom de la propriété JSONToujours généré ?Remarques
physicalLocationNone
idLes objets location qui apparaissent dans le tableau relatedLocations d’un objet result peuvent contenir la propriété id.
messageLes objets location peuvent contenir la propriété message si :

– Ils apparaissent dans le tableau relatedLocations d’un objet result pouvant contenir la propriété message.

– Ils apparaissent dans la propriété threadFlowLocation.location.

l'objet physicalLocation

Nom de la propriété JSONToujours généré ?Remarques
artifactLocationNone
regionSi le physicalLocation donné existe dans un fichier texte, comme un fichier de code source, alors la propriété region est peut-être présente.
contextRegionÉventuellement présente si cet emplacement a un snippet associé.

l'objet region

Il existe deux types d’objets region produits par CodeQL :

  • Régions de décalage de ligne/colonne

  • Régions de longueur et de décalage de caractères

Toute région produite par CodeQL peut être spécifiée dans l’un ou l’autre format, et les consommateurs doivent gérer l’un ou l’autre type de manière robuste.

Pour les régions de décalage de ligne/colonne, les propriétés suivantes sont définies :

Nom de la propriété JSONToujours généré ?Remarques
startLineNone
startColumnNon incluse si elle est égale à la valeur par défaut de 1.
endLineNon incluse si identique à startLine.
endColumnNone
snippetNone

Pour les régions de longueur et de décalage de caractères, les propriétés suivantes sont définies :

Nom de la propriété JSONToujours généré ?Remarques
charOffsetFournie si les propriétés startLine, startColumn, endLine et endColumn ne sont pas renseignées.
charLengthFournie si les propriétés startLine, startColumn, endLine et endColumn ne sont pas renseignées.
snippetNone

l'objet codeFlow

Nom de la propriété JSONToujours généré ?Remarques
threadFlowsNone

l'objet threadFlow

Nom de la propriété JSONToujours généré ?Remarques
locationsNone

l'objet threadFlowLocation

Nom de la propriété JSONToujours généré ?Remarques
locationNone