Ă propos des extracteurs
CodeQL CLI utilise des programmes spĂ©ciaux, appelĂ©s extracteurs, pour extraire des informations du code source dâun systĂšme logiciel dans une base de donnĂ©es pouvant ĂȘtre interrogĂ©e. Vous pouvez personnaliser le comportement des extracteurs en dĂ©finissant les options de configuration dâextracteur via CodeQL CLI.
Ă propos des options dâextracteur
Chaque extracteur dĂ©finit son propre ensemble dâoptions de configuration. Pour savoir quelles options sont disponibles pour un extracteur en particulier, vous pouvez exĂ©cuter codeql resolve languages
ou codeql resolve extractor
avec lâoption --format=betterjson
. Le format de sortie betterjson
fournit les chemins racines des extracteurs et dâautres informations. La sortie de codeql resolve extractor --format=betterjson
est souvent mise en forme comme dans lâexemple suivant :
{
"extractor_root" : "/home/user/codeql/java",
"extractor_options" : {
"option1" : {
"title" : "Java extractor option 1",
"description" : "An example string option for the Java extractor.",
"type" : "string",
"pattern" : "[a-z]+"
},
"group1" : {
"title" : "Java extractor group 1",
"description" : "An example option group for the Java extractor.",
"type" : "object",
"properties" : {
"option2" : {
"title" : "Java extractor option 2",
"description" : "An example array option for the Java extractor",
"type" : "array",
"pattern" : "[1-9][0-9]*"
}
}
}
}
}
Les noms et descriptions des options dâextracteur sont listĂ©s sous extractor_options
. Chaque option peut contenir les champs suivants :
title
(obligatoire) : titre de lâoptiondescription
(obligatoire) : description de lâoptiontype
(obligatoire) : type de lâoption, qui peut ĂȘtrestring
: indiquant que lâoption peut avoir une seule valeur de chaĂźnearray
: indiquant que lâoption peut avoir une sĂ©quence de valeurs de chaĂźneobject
: indiquant quâil ne sâagit pas dâune option en soi, mais dâun regroupement qui peut contenir dâautres options et groupes dâoptions
pattern
(facultatif) : modĂšles dâexpression rĂ©guliĂšre auxquels toutes les valeurs de lâoption doivent correspondre. Notez que lâextracteur peut imposer des contraintes supplĂ©mentaires aux valeurs dâoption qui ne sont pas ou ne peuvent pas ĂȘtre exprimĂ©es dans ce modĂšle dâexpression rĂ©guliĂšre. Ces contraintes, si elles existent, sont expliquĂ©es sous le champ de description.properties
(facultatif) : mappage des noms des options dâextracteur dans le groupe dâoptions aux descriptions des options dâextracteur correspondantes. Ce champ ne peut ĂȘtre prĂ©sent que pour les groupes dâoptions. Par exemple, les options de typeobject
.
Dans lâexemple ci-dessus, lâextracteur dĂ©clare deux options :
option1
est une optionstring
avec une valeur correspondant Ă[a-z]+
group1.option2
est une optionarray
avec des valeurs correspondant Ă[1-9][0-9]\*
DĂ©finition des options dâextracteur avec CodeQL CLI
CodeQL CLI prend en charge la dĂ©finition des options dâextracteur dans les sous-commandes qui appellent directement ou indirectement des extracteurs. Ces commandes sont :
codeql database create
codeql database start-tracing
codeql database trace-command
codeql database index-files
Lorsque vous exĂ©cutez ces sous-commandes, vous pouvez dĂ©finir les options dâextracteur avec lâoption CLI --extractor-option
. Par exemple :
codeql database create --extractor-option java.option1=abc ...
codeql database start-tracing --extractor-option java.group1.option2=102 ...
--extractor-option
nécessite exactement un argument de la forme extractor_option_name=extractor_option_value
. extractor_option_name
est le nom de lâextracteur (dans cet exemple, java
) suivi dâun point, puis du nom de lâoption dâextracteur (dans cet exemple, option1
ou group1.option2
). extractor_option_value
est la valeur affectĂ©e Ă lâoption dâextracteur. La valeur doit correspondre au modĂšle dâexpression rĂ©guliĂšre de lâoption dâextracteur (si elle existe), et elle ne doit pas contenir de caractĂšres de nouvelle ligne.
Lâutilisation de --extractor-option
pour affecter une option dâextracteur qui nâexiste pas est une erreur.
CodeQL CLI accepte plusieurs options --extractor-option
dans le mĂȘme appel. Si vous dĂ©finissez une option dâextracteur string
plusieurs fois, la derniĂšre valeur dâoption remplace toutes les prĂ©cĂ©dentes. Si vous dĂ©finissez une option dâextracteur array plusieurs fois, toutes les valeurs dâoption sont concatĂ©nĂ©es dans lâordre.
Vous pouvez Ă©galement spĂ©cifier des noms dâoptions dâextracteur sans le nom de lâextracteur. Par exemple :
codeql database create --extractor-option option1=abc ...
codeql database start-tracing --extractor-option group1.option2=102 ...
Si vous ne spĂ©cifiez pas de nom dâextracteur, les paramĂštres de lâoption dâextracteur sâappliquent Ă tous les extracteurs qui dĂ©clarent une option portant le nom donnĂ©. Dans lâexemple ci-dessus, la premiĂšre commande dĂ©finit lâoption dâextracteur option1
sur abc
pour lâextracteur java
et chaque extracteur qui a lâoption option1
, par exemple lâextracteur cpp
, si lâoption dâextracteur option1
existe pour cet extracteur.
DĂ©finition des options dâextracteur Ă partir de fichiers
Vous pouvez Ă©galement dĂ©finir des options dâextracteur via un fichier. Les sous-commandes CodeQL CLI qui acceptent --extractor-option
acceptent aussi --extractor-options-file
, qui a un argument obligatoire du chemin dâun fichier YAML (avec lâextension .yaml
ou .yml
) ou un fichier JSON (avec lâextension .json
). Par exemple :
codeql database create --extractor-options-file options.yml ...
codeql database start-tracing --extractor-options-file options.json ...
Chaque fichier dâoptions contient une arborescence de mappages imbriquĂ©s. Ă la racine se trouve une clĂ© de mappage dâextracteur, et dessous, se trouvent les clĂ©s de mappage qui correspondent aux noms dâextracteur. Ă partir du troisiĂšme niveau, se trouvent les options dâextracteur et les groupes dâoptions.
Dans JSON :
{
"extractor" : {
"java": {
"option1" : "abc",
"group1" : {
"option2" : [ 102 ]
}
}
}
}
Dans YAML :
extractor:
java:
option1: "abc"
group1:
option2: [ 102 ]
La valeur dâune option dâextracteur string
doit ĂȘtre une chaĂźne ou un nombre (qui sera converti en chaĂźne avant de poursuivre le traitement).
La valeur dâune option dâextracteur array
doit ĂȘtre un tableau de chaĂźnes ou de nombres.
La valeur dâun groupe dâoptions (de type object
) doit ĂȘtre un mappage, qui peut contenir des options dâextracteur et des groupes dâoptions imbriquĂ©s.
Chaque valeur dâoption dâextracteur doit correspondre au modĂšle dâexpression rĂ©guliĂšre de lâoption dâextracteur (si elle existe), et elle ne doit pas contenir de caractĂšres de nouvelle ligne.
Lâaffectation dâune option dâextracteur qui nâexiste pas est une erreur. Vous pouvez faire en sorte que CodeQL CLI ignore les options dâextracteur inconnues en utilisant un champ boolĂ©en __allow_unknown_properties
spĂ©cial. Par exemple, le fichier dâoptions suivant demande Ă CodeQL CLI dâignorer toutes les options dâextracteur et groupes dâoptions inconnus sous group1
:
extractor:
java:
option1: "abc"
group1:
__allow_unknown_properties: true
option2: [ 102 ]
Vous pouvez spécifier --extractor-options-file
plusieurs fois. Les affectations dâoptions dâextracteur sont traitĂ©es dans lâordre suivant :
- Tous les fichiers dâoptions dâextracteur spĂ©cifiĂ©s par
--extractor-options-file
sont traitĂ©s dans lâordre dans lequel ils apparaissent sur la ligne de commande, puis - Toutes les affectations dâoptions dâextracteur spĂ©cifiĂ©es par
--extractor-option
sont traitĂ©es dans lâordre dans lequel elles apparaissent sur la ligne de commande.
Les mĂȘmes rĂšgles rĂ©gissent ce qui se produit lorsque la mĂȘme option dâextracteur est dĂ©finie plusieurs fois, que les affectations soient effectuĂ©es avec --extractor-option
, avec --extractor-options-file
ou une combinaison des deux. Si vous dĂ©finissez une option dâextracteur string
plusieurs fois, la derniĂšre valeur dâoption remplace toutes les valeurs prĂ©cĂ©dentes. Si vous dĂ©finissez une option dâextracteur array
plusieurs fois, toutes les valeurs dâoption sont concatĂ©nĂ©es dans lâordre.