Coding Conventions are a set of guidelines for a specific programming language that recommend programming style and practices for each aspect of a program written in that language.

소스 코드의 가독성·유지보수성·안전성·보안성을 확보하기 위한 프로그래밍 언어별 가이드라인.

등장 배경 — Code Smells

가독성/유지보수가 어려운 코드:

  • 라인이 너무 김 (e.g., 130 > 79 chars)
  • 클래스/메서드 크기 과다
  • 미사용 변수

잠재적 리스크가 있는 코드:

→ 일관된 코딩 표준 적용으로 예방.

언어별 대표 표준

언어표준
CMISRA-C 2012, CERT C Coding Standard, HIS Source Code Metrics
C++JSF AV C++ Coding Standard, MISRA C++
JavaCERT Oracle Coding Standard for Java, PMD Rule Set, Java 시큐어 코딩 가이드
PythonStyle Guide for Python Code (PEP 8)

MISRA-C 2012

C 언어 기반 프로그램의 신뢰성, 안전성, 호환성을 확보하기 위해 MISRA에서 개발한 156개 Rule Set(22개 카테고리). 정적 분석 도구로 자동 검증.

주요 Rule 예시

Rule No.분류Description
1.1표준 C 환경C 표준과 사용하는 컴파일러의 번역 제한을 준수해야 한다
2.1사용하지 않는 코드도달할 수 없는 코드(unreachable code)가 있으면 안된다
5.4식별자매크로의 식별자는 구별해야 한다
9.1초기화모든 변수는 읽기 전에 할당해야 한다
11.1포인터 타입 변환함수 포인터와 다른 타입 간의 형 변환을 하면 안된다
15.1제어 흐름goto 문은 사용하면 안된다
17.2함수함수는 묵시적으로 선언하면 안된다

MISRA-C 2012 룰셋 22카테고리 요약

#룰 명가이드 수
1C 표준 (A standard C environment)3
2사용하지 않는 코드 (Unused code)7
3주석 (Comments)2
4문자셋과 어휘 요소 (Character sets and lexical conventions)2
5식별자 (Identifiers)9
6타입 (Types)2
7리터럴과 상수 (Literals and constants)4
8선언과 정의 (Declarations and definitions)14
9초기화 (Initialization)5
10에센셜 타입 모델 (The essential type model)8
11포인터 타입 변환 (Pointer type conversions)9
12표현식 (Expressions)6
13부작용 (Side effects)6
14제어문 표현식 (Control statements expressions)4
15제어흐름 (Control flow)7
16Switch문 (Switch statements)7
17함수 (Functions)8
18포인터와 배열 (Pointers and arrays)8
19저장 영역 덮어쓰기 (Overlapping storage)2
20전처리 지시자 (Preprocessing directives)14
21표준 라이브러리 (Standard libraries)21
22자원 (Resources)10
합계156

MISRA-C 2012 세분화 레벨

2012판부터 규칙 수준을 3레벨로 세분화하여 적용 유연성 제공.

레벨의미
Mandatory반드시 준수 — 위반 시 안전성/신뢰성에 심각한 영향. 예외 불허
Required반드시 준수하되, 정당한 사유가 있으면 예외 허용
Advisory가능하면 준수. 필수 사항은 아님

MISRA-C 변천사

구분PublishedGuidelinesLanguages특징
MISRA-C: 19981998.04127C90초판
MISRA-C: 20042004.10142C90
MISRA-C: 20122013.03169C90, C99규칙 수준 세분화 (Mandatory/Required/Advisory)
MISRA-C: 2012 Amendment 12016.04173C90, C99
MISRA-C: 2012 Amendment 22020.02175C90, C99, C11, C18
MISRA-C: 20232023.10179C90, C99, C11, C18C11/C18 공식 지원, 멀티스레딩·메모리 안전성 강화, 오탐(False-Positive) 감소
MISRA-C: 2025출시 예정Perforce 보고서에 따르면 자동차 개발자의 **53%**가 자신의 개발에 영향을 줄 것으로 예상

2023판 주요 변화

  • C11 (2011) — 멀티스레딩 지원, 정적 어설션 등 현대 기능 반영
  • C18 (2018) — C11 버그 수정·개선 반영
  • 멀티스레딩 환경 안전 프로그래밍 규칙 추가
  • 메모리 안전성 강화를 위한 규칙 개선
  • 최신 정적 분석 도구 및 코드 품질 평가 방법 반영 (가이드 제공·오탐 감소)

MISRA 발생 가능한 오류 4유형

MISRA가 탐지하려는 오류의 원인별 분류.

유형설명예시 (MISRA-C 2012 Rule)
개발자의 C언어 이해 부족C 언어의 동작 방식을 잘못 이해하여 발생산술 변환 관련 오류 (Rule 10.1)
개발자의 단순 실수타이핑 오류, 변수 사용 실수 등대입 =과 비교 == 혼동 (Rule 13.5)
컴파일러와 개발자 기대 불일치개발자 예상 동작과 실제 컴파일된 코드 동작 차이sizeof(char) 기대 불일치 등 Undefined Behavior (Rule 1.3)
컴파일러 자체 오류특정 컴파일러의 버그 또는 잘못된 최적화volatile 변수를 컴파일러가 최적화 제거 (Rule 8.9)

코딩 표준의 적용 효과

  • 의미 있는 파일명/메서드/변수명 사용
  • 클래스와 메서드는 간결하게 작성
  • 사용되지 않는 코드 제거
  • 필요한 코드에 주석 작성
  • 변수는 항상 초기화
  • 전역 변수를 사용하지 않음

가독성/유지보수 향상 + 소프트웨어 품질 향상 (Safety, Security 개선).

도요타 급발진 사례

“Toyota Did Not Follow Own Coding Standard — 80,000 Violations of MISRA-C Rule”

자체 코딩 표준조차 준수하지 않은 도요타 ECU 펌웨어. 급발진 사고의 원인 중 하나로 지목됨.

예제

Rule #1 — 지역 변수 초기화

// AS-IS (X)
int a, b;
while (b++ < 100000) { a++; }
 
// TO-BE (O)
int a=0, b=0;
while (b++ < 100000) { a++; }

Rule #2 — 버퍼 오버플로우 방지

// AS-IS (X) — idx == 10일 때 buf[10] 접근 (배열 범위 초과)
int idx; int buf[10];
scanf("%d", &idx);
if (idx >= 0 && idx <= 10)  // 잘못된 경계
    buf[idx] = 10;
 
// TO-BE (O)
if (idx >= 0 && idx < 10)
    buf[idx] = 10;

Rule #3 — 0으로 나누기 방지

// AS-IS (X) — i<=10이면 a==0인 채로 cnt/a 수행 → Divide by Zero
int func(int i) {
    int a=0; int cnt=100;
    if (i>10) { a=random(); }
    int b = cnt / a;  // 사고 발생 가능
}
 
// TO-BE (O)
if (a > 0) {
    int b = cnt / a;
}

HIS Source Code Metrics

HIS(Hersteller Initiative Software)가 제시한 자동차 C 코드 메트릭 기준. 함수 단위로 9개 지표를 측정한다. 정량 메트릭 전반은 소스코드 메트릭 참조.

Metric설명HIS 기준 범위방위사업청 기준
COMF (Comment Density)코드 라인 당 주석 라인 수> 0.2
PATH함수 내 실행 가능한 경로 수1~80
GOTOgoto 문의 개수0
v(G) (순환 복잡도)코드 내 조건문 수 + 11~1020 이하
CALLING다른 함수를 호출하는 건수0~58 이하
CALLS다른 함수로부터의 피호출 건수0~710 이하
PARAM함수 인터페이스의 파라미터 수0~58 이하
STMT함수 당 명령어(구문) 수1~50200 이하
LEVEL한 함수의 중첩 호출(Call Level) 수0~46 이하
RETURN한 함수 내 반환점(Return) 수0~1

RETURN 기준

단일 진출점 원칙에 따라 0~1을 채택. 일부는 0~4까지 허용 범위로 제시하므로, 적용 프로젝트의 기준 문서를 우선한다. 0~1 해석은 ISO 26262 Table 6 1a “One entry and one exit point” 권장과 정합한다.

같이 보기