pycparser를 이용한 C 코드 검토 도구
배경·목적
평상시 C 언어의 소프트 개발하고 있어
코드 검토를 요청하기 전에 자신이 작성한 코드가 코딩 규칙을 따라 작성되었는지 자체 검사하는 도구를 원했습니다.
코드의 구문 분석 처리로부터 만드는 것은 힘들기 때문에 뭔가 좋은 라이브러리는 없는지 찾았는데,
pycparser라는 라이브러리를 사용할 수 있었기 때문에, 이것을 사용한 코드 리뷰 툴, 「pycreviewer」를 만들었습니다.
htps : // 기주 b. 이 m / d 로마 r-so ft / Pyc
실행 환경
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.
"""
주의사항
기능
해당 코딩 규칙 목록
정적 변수 이름 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.
"""
주의사항
#inclide <stdio.h>
static int m_var;
#inclide <stdio.h>
int g_var;
int i;
switch(flag){
case 0:
break;
case 1:
//No Break
default:
break;
}
switch(f){
case 0:
break;
case 1:
break;
//No Default
}
{
"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.
"""
주의사항
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.
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.
"""
따라서 대상 소스 코드의 컴파일 오류를 미리 제거해야 합니다.
마지막으로
Reference
이 문제에 관하여(pycparser를 이용한 C 코드 검토 도구), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Dromar61243968/items/468adc4185fe793f9d51텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)