[PYTHON] C-Code-Überprüfungstool mit pycparser

Hintergrund Zweck

Normalerweise entwickle ich Software für die Sprache C. Bevor ich eine Codeüberprüfung anforderte, wollte ich, dass ein Tool selbst überprüft, ob mein Code gemäß den Codierungsregeln geschrieben wurde.

Es ist schwierig, aus dem Syntaxanalyseprozess des Codes etwas zu machen, deshalb habe ich nach einer guten Bibliothek gesucht und gefunden Es schien, dass eine Bibliothek namens pycparser verwendet werden könnte, also habe ich damit ein Codeüberprüfungstool namens "pycreviewer" erstellt. https://github.com/dromar-soft/Pycreviewer

Ausführungsumgebung

Über Pycparser

pycparser ist eine von eliben entwickelte C-Sprachsyntax-Analysebibliothek. https://github.com/eliben/pycparser

Design

Funktion

Liste der entsprechenden Codierungsregeln

Static variable name prefix

Stellen Sie sicher, dass der Name der statischen Variablen ein bestimmtes Präfix hat (z. B. 'm_').

#inclide <stdio.h>
static int m_var;

Global variable name prefix

Stellen Sie sicher, dass der Name der globalen Variablen ein bestimmtes Präfix hat (z. B. 'g_').

#inclide <stdio.h>
int g_var;

Too short variable name

Erkennt zu kurze Variablennamen.

int i;

Recursive call

Erkennt rekursive Funktionsaufrufe.

Function blacklist

Erkennt deaktivierte Funktionsaufrufe. (Funktionen, deren Verwendung verboten ist, werden in der später beschriebenen JSON-Datei festgelegt.)

No break statement in the switch-case statement

Erkennt, wo die break () -Anweisung nicht in der switch-case-Anweisung enthalten ist.

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

No default statement in switch statement

Erkennt, wo die Standardanweisung nicht in der switch-Anweisung definiert ist.

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

Festlegen detaillierter Bedingungen durch JSON-Datei

{
    "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

Wie benutzt man

Wird als Konsolenanwendung verwendet

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.

Als Bibliothek verwenden

Sie können eine Codeüberprüfung für eine einzelne Quelldatei durchführen, indem Sie pycreviewer.review_file () aufrufen.

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.
    """

Vorsichtsmaßnahmen

Schließlich

Recommended Posts

C-Code-Überprüfungstool mit pycparser
Führen Sie Python-Code unter C ++ aus (mit Boost.Python).
Versuchen Sie es mit Sourcetrail, einem Quellcode-Visualisierungstool
Typunabhängig mit C ++ - Vorlagen
Verwenden von X11 mit ubuntu18.04 (C-Sprache)
Tool zum Überprüfen des Codestils
Formatieren Sie die Sprachquelle C mit pycparser