Skip to main content

Options d’extracteur

Vous pouvez utiliser CodeQL CLI pour développer des processus CodeQL localement sur des projets logiciels.

Qui peut utiliser cette fonctionnalité ?

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

À 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’option
  • description (obligatoire) : description de l’option
  • type (obligatoire) : type de l’option, qui peut ĂȘtre
    • string : indiquant que l’option peut avoir une seule valeur de chaĂźne
    • array : indiquant que l’option peut avoir une sĂ©quence de valeurs de chaĂźne
    • object : 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 type object.

Dans l’exemple ci-dessus, l’extracteur dĂ©clare deux options :

  • option1 est une option string avec une valeur correspondant Ă  [a-z]+
  • group1.option2 est une option array 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 :

  1. 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
  2. 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.