[PYTHON] Outil de révision de code C utilisant pycparser

but de fond

Je développe généralement des logiciels pour le langage C Avant de demander une révision de code, je voulais un outil pour vérifier moi-même que mon code a été écrit selon les règles de codage.

C'est difficile à faire à partir du processus d'analyse syntaxique du code, j'ai donc cherché une bonne bibliothèque et trouvé Il semblait qu'une bibliothèque appelée pycparser pouvait être utilisée, j'ai donc créé un outil de révision de code "pycreviewer" en l'utilisant. https://github.com/dromar-soft/Pycreviewer

Environnement d'exécution

À propos de pycparser

pycparser est une bibliothèque d'analyse syntaxique du langage C développée par eliben. https://github.com/eliben/pycparser

conception

une fonction

Liste des règles de codage correspondantes

Static variable name prefix

Assurez-vous que le nom de la variable statique a un préfixe spécifique (par exemple "m_").

#inclide <stdio.h>
static int m_var;

Global variable name prefix

Assurez-vous que le nom de la variable globale a un préfixe spécifique (par exemple «g_»).

#inclide <stdio.h>
int g_var;

Too short variable name

Détecte les noms de variables trop courts.

int i;

Recursive call

Détecte les appels récursifs aux fonctions.

Function blacklist

Détecte les appels de fonction désactivés. (Les fonctions interdites d'utilisation sont définies dans le fichier JSON décrit plus loin)

No break statement in the switch-case statement

Détecte où l'instruction break () n'est pas incluse dans l'instruction switch-case.

    switch(flag){
        case 0:
            break;
        case 1:
            //No Break
        default:
            break;
    }

No default statement in switch statement

Détecte les endroits où l'instruction par défaut n'est pas définie dans l'instruction switch.

        switch(f){
            case 0:
                break;
            case 1:
                break;
            //No Default
        }

Définition des conditions détaillées par fichier JSON

{
    "version": "0.1.0",
    "conditions":{
        "static_variable_prefix":{
            "id":"R001",
            "param":"m_",
            "level":"SHOULD"
        },
        "global_variable_prefix":{
            "id":"R002",
            "param":"g_",
            "level":"SHOULD"
        },
        "variable_short_name":{
            "id":"R003",
            "param":2,
            "level":"MUST"
        },
        "recursive_call":{
            "id":"R004",
            "param":true,
            "level":"MUST"
        },
        "function_blacklist":{
            "id":"R005",
            "param":[
                "malloc",
                "free"
            ],
            "level":"WANT"
        },
        "no_break_in_switch":{
            "id":"R006",
            "param":true,
            "level":"SHOULD"
        },
        "no_default_in_switch":{
            "id":"R007",
            "param":true,
            "level":"SHOULD"
        }
    }
}

Installation

git clone https://github.com/dromar-soft/Pycreviewer.git

Comment utiliser

Utilisé comme application console

python -m pycreviewer
input source folder >> 'your sourcecode directory'
{'id': 'R006', 'level': 'SHOULD', 'msg': 'No break statement in switch-case statement.', 'file': '/xxx/xxx/xxx.c', 'line': X, 'column': X}
{'id': 'R007', 'level': 'SHOULD', 'msg': 'No default statement in switch-case statement.', 'file': '/xxx/xxx/xxx.c', 'line': X, 'column': Y}
...
...
...
X files codereview completed. Please enter esc key.

Utiliser comme bibliothèque

Vous pouvez effectuer une révision de code sur un seul fichier source en appelant pycreviewer.review_file ().

def review_file(sourcefile: str, cpp_args=['-E', r'-Ipycreviewer/utils/fake_libc_include'], jsonfile='./default.json') ->list:
    """
    Perform code review on a single source file.
    The result of the code review is returned in the form of List<CheckResult>.
    sourcefile:
        the target source file path.
    cppargs:
        a list of command line arguments for the preprocessor execution of C compiler.
        Normally, specifies the preprocessor execution option '-E' and the include option '-Ixxxxx'.
    jsonfile:
        JSON file path describing the checking conditions for coding rules.
    """

Remarques

finalement

Recommended Posts

Outil de révision de code C utilisant pycparser
Exécuter du code Python sur C ++ (en utilisant Boost.Python)
Essayez d'utiliser Sourcetrail, un outil de visualisation de code source
Indépendant du type à l'aide de modèles C ++
Utilisation de X11 avec ubuntu18.04 (langage C)
Outil pour vérifier le style de code
Formater la source du langage C avec pycparser