Embedded C Lint — 임베디드 C 규칙 검사기 상세 설계서
상태: PUBLIC · ACTIVE · MIT 라이선스 기술 스택: Python 3.9+ (표준 라이브러리만), unittest, GitHub Actions 카테고리: Developer Tool
1. 문제와 대상 사용자
임베디드 C 코드 리뷰는 "함수 이름이 컨벤션에 맞는가", "탭인가 스페이스인가" 같이 기계적으로 판정 가능한 항목을 사람이 눈으로 훑는 데 시간을 많이 씁니다. 이 도구는 그 부분을 스크립트로 넘겨, ISR 블로킹이나 상태 머신 설계처럼 실제 판단이 필요한 곳에 리뷰 시간을 쓰게 합니다. 대상은 MCU 펌웨어를 다루는 개발자와 리뷰어입니다.
2. 검사 규칙
| 규칙 ID | 심각도 | 내용 |
|---|---|---|
NAMING-FILE | ERROR | 파일명 snake_case |
NAMING-FUNC | ERROR | 함수명 PascalCase (IRQ 핸들러·main 제외) |
NAMING-GLOBAL | ERROR | 전역 변수 g_ 접두사 |
NAMING-STATIC | ERROR | 정적 변수 s_ 접두사 |
NAMING-MACRO | ERROR | 매크로 UPPER_SNAKE_CASE |
NO-MALLOC | ERROR | malloc/calloc/realloc/free 금지 |
FMT-TAB | ERROR | 탭 금지, 4-스페이스 들여쓰기 |
FMT-LINELEN | ERROR | 라인 100자 이하 |
FMT-BRACE | ERROR | K&R 스타일 (여는 중괄호 같은 줄) |
FMT-HEADERGUARD | ERROR | 헤더 가드 (.h) |
FMT-EXTERNC | ERROR | extern "C" 블록 (.h) |
DOC-DOXYGEN | WARN | 함수 Doxygen 주석 |
STRUCT-PACKED | WARN | 구조체 __attribute__((packed)) |
3. 기술 선택 이유
- 표준 라이브러리만 사용:
pip install없이 어느 빌드 환경에서나 바로 돌아가야 CI 게이트로 쓸 수 있습니다. - 종료 코드 규약: ERROR가 하나라도 있으면
1, 없으면0을 반환해 pre-commit 훅이나 CI에 그대로 연결됩니다. - JSON 출력:
--json옵션으로 리포트를 다른 도구에 넘길 수 있습니다.
4. 현재 범위
- 규칙 13종 검사, 디렉터리 재귀 검사, 규칙 선택 실행(
--rules), JSON 출력이 동작합니다. - 규칙별로 위반/통과 케이스를 하나씩 두는 테스트를 유지합니다.
- 웹 아카이브에서는 임의 코드를 실행하지 않습니다. 고정된 예시 입력과 그 검사 결과만 문서로 보여 줍니다.
5. 알려진 한계
- 정규식 기반 정적 분석이라 완전한 C 파서가 아닙니다. 예를 들어 한 줄에 변수를 여러 개 선언하면(
int a, b;) 네이밍 검사를 건너뜁니다. - ISR 논블로킹, 상태 머신, 저전력 처리처럼 판단이 필요한 항목은 스크립트가 다루지 않고 리뷰 체크리스트로 남겨 둡니다.
6. 다음 검증
- 오탐 사례 수집과 규칙별 예외 처리 보강
- 공개 예제 페이지의 입력·출력이 실제 스크립트 결과와 일치하는지 배포 전 확인