pycparser를 이용한 C 코드 검토 도구

11385 단어 파이썬Python3C

배경·목적



평상시 C 언어의 소프트 개발하고 있어
코드 검토를 요청하기 전에 자신이 작성한 코드가 코딩 규칙을 따라 작성되었는지 자체 검사하는 도구를 원했습니다.

코드의 구문 분석 처리로부터 만드는 것은 힘들기 때문에 뭔가 좋은 라이브러리는 없는지 찾았는데,
pycparser라는 라이브러리를 사용할 수 있었기 때문에, 이것을 사용한 코드 리뷰 툴, 「pycreviewer」를 만들었습니다.
htps : // 기주 b. 이 m / d 로마 r-so ft / Pyc

실행 환경


  • Python 3.8.2.
  • pycparser 2.2.0( htps : // 기주 b. 코 m / 에반 / pyc 파 r r )

  • pycparser 정보



    pycparser는 eliben이 개발 한 C 언어 구문 분석 라이브러리입니다.
    htps : // 기주 b. 코 m / 에반 / pyc 파 r r

    디자인





    기능



    해당 코딩 규칙 목록



    정적 변수 이름 prefix



    static 변수명에 특정의 접두사(예를 들면 'm_')가 붙어 있는지를 확인합니다.
    #inclide <stdio.h>
    static int m_var;
    

    Global variable name prefix



    global 변수 이름에 특정 접두사(예: 'g_')가 붙어 있는지 확인합니다.
    #inclide <stdio.h>
    int g_var;
    

    Too short variable name



    너무 짧은 변수 이름을 감지합니다.
    int i;
    

    Recursive call



    함수의 재기 호출을 검출합니다.

    Function blacklist



    사용 금지 함수 호출을 감지합니다.
    (사용 금지의 함수는 후술하는 JSON 파일로 설정)

    No break statement in the switch-case statement



    switch-case문중에 break()문이 들어 있지 않은 개소를 검출합니다.
        switch(flag){
            case 0:
                break;
            case 1:
                //No Break
            default:
                break;
        }
    

    No default statement in switch statement



    switch 문에서 default 문이 정의되지 않은 위치를 감지합니다.
            switch(f){
                case 0:
                    break;
                case 1:
                    break;
                //No Default
            }
    

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

    설치


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

    사용법



    콘솔 애플리케이션으로 사용


    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.
    

    라이브러리로 사용



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

    주의사항


  • C 언어 소스 코드를 구문 분석하기 위해이 라이브러리는 C 컴파일러 전처리 기 (gcc -E)를 실행합니다.
    따라서 대상 소스 코드의 컴파일 오류를 미리 제거해야 합니다.

  • 마지막으로


  • 내가 작성한 코드가 코딩 규칙에 따라 작성되었는지 자체 검사하는 도구를 개발했습니다.
  • 2020/5/31 시점에서는 몇개의 간단한 룰만 구현하고 있습니다만, 필요에 따라서 추가의 룰을 구현해 갑니다.
  • 좋은 웹페이지 즐겨찾기