MISRA C

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

MISRA C는 C 언어를 안전하게 사용하기 위한 코딩 표준으로, 1998년 처음 발표되었다. 자동차 산업을 중심으로 발전하여 항공우주, 의료 기기 등 다양한 분야에서 활용되고 있으며, C 언어의 이식성, 안전성 확보를 위해 코딩 규칙을 정비하고 표준화하는 데 기여한다. MISRA C는 여러 개정판을 거치며 C99, C11, C17 등 C 언어 표준을 지원하며, 규칙 준수를 넘어 예외 사항의 문서화를 권장한다. MISRA C의 준수를 돕는 다양한 도구들이 존재하지만, 모든 규칙을 100% 만족하는 도구는 없으며, 몇몇 연구에서는 MISRA C의 효과에 대한 비판적인 시각도 제시되었다.

MISRA C
📚 더 읽어볼만한 페이지
  • 컴퓨터 표준 - 포트란
    포트란은 1950년대 IBM에서 개발되어 과학 및 공학 계산에 주로 사용되는 프로그래밍 언어이며, '수식 번역 시스템'에서 유래하여 객체 지향 프로그래밍, 병렬 처리 등의 기능이 추가되며 현대적인 언어로 발전해왔다.
  • 컴퓨터 표준 - PCI 익스프레스
    PCI 익스프레스(PCIe)는 고속 직렬 통신을 사용하는 컴퓨터 확장 카드 인터페이스 규격으로, 점대점 연결 방식과 패킷 기반 데이터 전송, 그리고 다양한 레인 구성과 지속적인 발전을 특징으로 한다.
  • C 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • C 프로그래밍 언어 - 헤더 파일
    헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다.
  • C 프로그래밍 언어 계열 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • C 프로그래밍 언어 계열 -
    펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다.

2. 역사

MISRA C는 1997년에 초안이 작성되었다. 1998년, "차량 기반 소프트웨어에서 C 언어 사용 지침"이라는 MISRA-C의 초판이 출판되었으며, 공식적으로 MISRA-C:1998로 알려져 있다.

MISRA-C:1998에는 127개의 규칙이 있으며, 이 중 93개는 필수, 34개는 권장 사항이었다. 규칙은 1부터 127까지 번호가 매겨져 있다.

2004년에는 MISRA-C:2004가 제작되었는데, 이는 "중요 시스템에서 C 언어 사용을 위한 가이드라인"의 두 번째 판이다. 여기에는 규칙의 완전한 재정렬을 포함하여 가이드라인에 많은 실질적인 변경이 있었다. MISRA-C:2004는 142개의 규칙을 포함하며, 그 중 122개는 "필수", 20개는 "권고" 사항이며, "환경"에서 "런타임 오류"까지 21개의 주제별 범주로 나뉜다.

MISRA C:2012가 발표되면서 새로운 가이드라인 범주인 지침이 도입되었는데, 이는 준수 여부가 더 열린 해석을 필요로 하거나, 프로세스 또는 절차적 문제와 관련이 있다.

👆
좌우로 밀어서 보기
| 년도 || 설명
초안1997년
초판1998년규칙 (필수/권장)
2판2004년규칙 (필수/권장)
3판2012년지침; 규칙 (결정 가능/결정 불가능)
MISRA 준수2016년, 2020년업데이트
MISRA C:20232023년MISRA C 3판, 2차 개정

3. 규칙 분류 및 특징

MISRA C 지침은 '필수', '요구 사항', '권장 사항'으로 분류된다. 각 지침의 준수 의무는 다음과 같다.

* '필수' 지침은 반드시 지켜야 한다.
* '요구 사항' 지침은 예외적인 경우를 제외하고는 지켜야 한다.
* '권장 사항' 지침은 좋은 사례로 여겨지지만, 반드시 지켜야 하는 것은 아니다.

MISRA 준수 문서는 '권장 사항' 지침에 대해서는 '미적용'을 허용한다.

MISRA-C:2012는 143개의 규칙을 포함하며, 이 중 10개는 의무, 101개는 필수, 32개는 권장 사항으로 구성되어 있다.

3.1. 분류

MISRA C는 규칙의 강제성에 따라 '필수' 규칙과 '권고' 규칙으로 분류된다.

👆
좌우로 밀어서 보기
| 필수 규칙 수 || 권고 규칙 수 || 총 규칙 수 || 규칙 번호
MISRA-C:199893개34개127개1번부터 127번까지
MISRA-C:2004121개20개141개"Environment"부터 "Run-time failure"까지 21개 그룹, 각 그룹별 1.1부터 21.1까지



새로운 소프트웨어 프로젝트를 시작할 때는 최신 MISRA 표준을 사용해야 한다. 이전 표준은 해당 표준을 참조해야 하는 기존 소프트웨어 프로젝트에서 계속 사용할 수 있다.

3.2. 범주

MISRA-C:1998에는 총 127개의 규칙이 있으며, 93개의 필수 규칙과 34개의 권고 규칙으로 구성되어 있다. 규칙 번호는 1번부터 127번 형식으로 구성되어 있다.

MISRA-C:2004에는 총 141개의 규칙이 있으며, 121개의 필수 규칙과 20개의 권고 규칙으로 구성되어 있다. 각각의 규칙들은 "Environment"부터 "Run-time failure"까지 21개의 그룹으로 구성되어 있고, 번호는 1.1부터 21.1까지 각 그룹별로 매겨져 있다.

새로운 소프트웨어 프로젝트를 시작할 때는 최신 MISRA 표준을 사용해야 한다. 이전 표준은 해당 표준을 참조해야 하는 기존 소프트웨어 프로젝트에서 계속 사용할 수 있다.

규칙은 논리적으로 다음과 같은 여러 범주로 나눌 수 있다.

* 가능한 컴파일러 차이점을 피하기 위한 규칙. (예: C의 `int` 타입 크기는 다를 수 있지만, `int16_t` (C99에서 표준화됨)는 항상 16비트이다.)
* 실패하기 쉬운 함수 및 구문 사용을 피하기 위한 규칙. (예: `malloc`은 실패할 수 있다.)
* 유지 보수 및 디버깅 가능한 코드를 생성하기 위한 규칙. (예: 명명 규칙 및 주석)
* 모범 사례 규칙.
* 복잡성 제한.

3.3. 범위

MISRA C는 규칙의 개수와 구성 방식에 따라 여러 버전으로 나뉜다.

👆
좌우로 밀어서 보기
버전규칙 개수필수 규칙권고 규칙규칙 번호
MISRA-C:1998127개93개34개1번부터 127번까지 순서대로
MISRA-C:2004141개121개20개"Environment"부터 "Run-time failure"까지 21개의 그룹으로 나뉘어 있으며, 각 그룹별로 1.1부터 21.1까지


MISRA C:2012는 각 가이드라인을 '단일 번역 단위' 또는 '시스템'으로 별도로 분류한다.

새로운 소프트웨어 프로젝트를 시작할 때는 최신 MISRA 표준을 사용하는 것이 좋으며, 이전 표준은 해당 표준을 참조해야 하는 기존 소프트웨어 프로젝트에서 계속 사용할 수 있다.

3.4. 결정 가능성

MISRA C:2012는 '규칙'(하지만 '지침'은 제외)을 '결정 가능' 또는 '결정 불가능'으로 분류한다.

4. C 언어의 문제점 및 MISRA C의 역할

C 언어 표준에서 규정하는 실행 환경에는 운영체제(OS)의 존재를 전제로 하는 호스트 환경과 OS를 이용하지 않거나 OS 자체를 기술하는 것을 전제로 하는 프리 스탠딩 환경이 있다. 임베디드 환경은 후자에 해당한다. C 언어는 고급 언어의 탈을 쓴 어셈블러(고급 어셈블러, 범용 어셈블러)라고도 불릴 정도로 하드웨어를 직접 제어할 수 있으면서도 이식성이 높은 언어이며, 그렇기에 리소스 제한 및 성능 요구가 엄격한 임베디드 환경이나 디바이스 드라이버 개발의 주류 언어로서 계속 사용되고 있다. 임베디드 프로세서 등의 칩 벤더가 자사 하드웨어 판매 시 C 컴파일러를 함께 제공하기도 한다. 커널 모드 드라이버는 C 언어로만 기술해야 하는 환경도 있다.

그러나 자바C#와 같은 고수준의 가상 머신 기반 프로그래밍 언어와 비교했을 때, C 언어는 안전성에 관해 충분히 고려되었다고 말하기 어렵다. 파스칼 등 동시대 혹은 그 이전에 등장한 다른 언어와 비교해도 문자열 처리 등에서 안전성이 떨어지는 부분이 있다. 특히 버퍼 오버런이나 스택 오버플로우에 의한 메모리 접근 위반, 메모리 해제 누락에 의한 메모리 누수 등 C 언어에서는 시스템 정지나 정의되지 않은 동작을 초래하는 치명적인 소프트웨어 결함에 대한 최종 방어벽이 없으며, 이는 프로그래머 측의 부담과 책임으로 이어진다. C 언어에서 직접 발전한 C++(C++) 언어에 대해서도 어느 정도 개선 및 개량된 부분이 있지만, 여전히 C 언어와 동일한 문제점을 안고 있는 부분이 있다.

최신 후발 언어는 이식성이 없는 프로그램이나 위험한 프로그램을 작성하기 어려운 (혹은 작성할 수 없는) 사양으로 되어 있는 반면, C/C++ 언어는 원래 프로그래머를 신뢰하고, 프로그래머가 할 수 있는 것을 제한하지 않는 설계 사상을 가지고 있다. 따라서 C/C++ 언어로 이식성 및 안전성을 확보하면서 프로그램을 작성하기 위해서는, 어떤 코딩 규칙을 정비·표준화하여 운영 시에 제한을 걸 필요가 있다.

5. MISRA 준수

MISRA는 MISRA 준수 사항을 이해하고 달성하기 위한 추가 지침을 제공하는 문서를 발행했다.

* MISRA 준수:2016은 2016년 4월 MISRA에서 발표했다.
* MISRA 준수:2020 개정판은 2020년 2월에 발표되었다.

MISRA C 가이드라인을 준수한다고 주장하는 소프트웨어는 모든 필수 규칙을 충족해야 하며, 모든 요구 규칙과 지침은 충족되거나 공식적인 예외 적용을 받아야 한다. 권고 규칙은 공식적인 예외 적용 없이 적용되지 않을 수 있지만, 이는 여전히 프로젝트 문서에 기록되어야 한다.

준수 목적상, 규칙지침 사이에는 구분이 없다.

5.1. 예외(Deviation)

MISRA C의 많은 규칙은 특정 조건에서 소프트웨어 엔지니어가 규칙에서 벗어나도 여전히 표준을 준수하는 것으로 간주될 수 있기 때문에 지침으로 특징지을 수 있다. 예외는 코드 또는 파일에 문서화해야 한다. 또한, 소프트웨어 엔지니어가 시스템의 안전성을 고려했으며 규칙에서 벗어나는 것이 부정적인 영향을 미치지 않는다는 증거를 제공해야 한다. 예외에 대한 요구 사항은 다음과 같다.

* 벗어난 규칙.
* 예외에 대한 근거.

6. 관련 도구

MISRA C 준수를 위한 다양한 소프트웨어 도구들이 존재하지만, 어떤 도구도 MISRA C를 100% 만족시킬 수는 없다. 그 이유는 MISRA C 규칙 중에는 반드시 사람이 직접 확인해야 하는 내용이 포함되어 있기 때문이다.

MISRA 준수를 위해 코드를 검사한다고 주장하는 많은 소프트웨어 도구가 있지만, MISRA 인증 프로세스는 없다. 대부분의 가이드라인은 정적 코드 분석을 수행하는 도구를 사용하여 검사할 수 있다. 나머지 가이드라인은 동적 코드 분석을 사용해야 한다.

"MISRA 표준을 준수한다"는 점을 내세우는 코드 검사 도구가 많이 있지만, MISRA는 제3자에 의한 허가 및 인가 제도를 가지고 있지 않으므로 자체 선언이다.

MISRA GitLab 저장소(로그인 필요)에서 예제 스위트(MISRA-C:2004 및 MISRA C:2012용)를 사용할 수 있다. 이를 통해 도구 사용자는 다양한 MISRA 도구에서 제공하는 검사 지원을 평가하고 비교할 수 있으며, 도구 구현자에게는 MISRA 가이드라인의 의도에 대한 지침을 제공한다.

MISRA 도구 이용자가 평가하고 비교할 수 있도록 MISRA-C:2004 및 MISRA-C:2012의 예제 프로그램을 MISRA 게시판에서 다운로드할 수 있다.

다음은 MISRA 준수를 위해 코드를 검사하는 도구 및 지원하는 C/C++ 컴파일러 목록이다.

👆
좌우로 밀어서 보기
도구 종류도구 이름비고
코드 분석 도구Astrée (AbsInt)
Axivion Bauhaus Suite (Axivion GmbH)MISRA C:2004, C:2012, C:2012 Amendment 1, C++:2008, Compliance:2016
CodeSonar (GrammaTech)
Coverity (Synopsys)정적 분석
CppcheckC/C++용 오픈 소스 정적 분석 도구
ECLAIR (BUGSENG srl)MISRA C:2004, C:2012, C:2012 Amendment 1, C++:2008
Helix QAC (Perforce Software)MISRA C:1998, C:2004, C:2012, C++:2008
Klocwork ([Rogue Wave Software](현재 Perforce Software 소유))MISRA C:2012, C:2012 Amendment 1, C++:2008
LDRA Testbed (Liverpool Data Research Associates)
Parasoft C/C++test (Parasoft)MISRA C 1998, MISRA C 2004, MISRA C 2012 AMD1, AMD2 and AMD3, MISRA C++ 2008, Draft version of MISRA C++ 202x
PC-Lint ([Gimpel Software](현재 Vector Informatik GmbH 소유))MISRA C:1998, C:2004, C:2012, C++:2008
Polyspace (MathWorks)
PVS-Studio (Program Verification Systems)
코드 분석 도구
(외부 링크)
IAR C-STATMISRA-C, CERT, CWE
한컴MDS QACCode Inspection, MISRA-C
소프트4소프트, RESORT for CMISRA-C
PRQA QAC
코드 분석 도구
(기타)
SonarQube (SonarSource)오픈 소스, 일부 상업용 플러그인 구성 요소 포함
SQuORE (Squoring Technologies)
Understand (SciTools)
SPARROW QCE
C/C++ 컴파일러Green Hills Software
IAR SystemsMISRA C:1998, C:2004, C:2012, C++:2008
TASKINGMISRA C:1998, C:2004, C:2012


정적 코드 분석 도구 목록도 참조.

7. 비판

Les Hatton은 MISRA C:1998과 MISRA C:2004에 대한 이전 연구를 비교하는 논문에서 다음과 같은 결론을 내렸다.

:"MISRA C 표준의 영향력이 확대되는 점을 고려하여, 이 논문은 원래 표준의 중요한 결함이 만족스럽게 해결되었는지 평가하고자 한다. 불행하게도 그렇지 못했고, 중요 양성 대 오양성 비율은 MISRA C 2004에서 MISRA C 1998보다 크게 개선되지 않았으며, 두 경우 모두 용납할 수 없을 정도로 낮다."

그는 이어서 다음과 같이 언급했다.

:"현재 형태로 볼 때, MISRA C 2004 업데이트의 혜택을 받는 유일한 사람은 도구 공급업체인 것으로 보이며, 향후 개정에서 발표된 실험 데이터를 조금 더 참고하고 좋은 아이디어처럼 보이는 규칙을 발명하려는 유혹을 덜 함으로써 문구를 단순화하고 오양성 비율을 줄이기 위한 조치가 취해지기를 바란다."

델프트 공과대학교(TU Delft)의 Cathal Boogerd와 Leon Moonen의 연구는 MISRA C:2004의 가치를 실증적으로 평가했는데, 이 연구는 비슷한 결과를 보였다.

:"얻은 데이터를 통해 다음과 같은 주요 관찰을 할 수 있다. 첫째, 결함 관련 라인을 찾는 데 있어 무작위 예측기보다 유의미하게 (α = 0.05) 더 나은 성능을 보이는 72개의 규칙 중 9개가 있다. 이 규칙들의 진양성률은 24-100% 범위이다. 둘째, MISRA 규칙 위반과 관찰된 결함 사이에 음의 상관 관계가 있음을 관찰했다. 또한, 72개의 규칙 중 29개는 0의 진양성률을 보였다. Adams의 모든 수정이 결함을 발생시킬 확률이 0이 아니라는 관찰과 함께, 이는 MISRA 표준을 전체적으로 준수하는 것이 소프트웨어를 덜 신뢰할 수 있게 만들 수 있음을 시사한다."

8. 활용 분야

MISRA C는 원래 자동차 산업을 목표로 개발되었지만, 현재는 자동차, 항공우주, 통신, 의료 기기, 국방, 철도 등 다양한 분야에서 널리 채택되고 있다.

* 합동 공격 전투기 프로젝트의 C++ 코딩 표준은 MISRA-C:1998을 기반으로 한다.
* NASA 제트 추진 연구소의 C 코딩 표준은 MISRA-C:2004를 기반으로 한다.
* IEC 81001-5-1:2021 "건강 소프트웨어 및 건강 IT 시스템의 안전, 효과 및 보안 - 파트 5-1: 보안 - 제품 수명 주기 활동"은 안전한 코딩 모범 사례의 예시로 MISRA C를 언급하고 있다.
* ISO 26262 "기능 안전 - 도로 차량"은 MISRA C를 C 언어의 적절한 하위 집합으로 언급한다.
* ISO 26262-6:2011 "파트 6: 소프트웨어 수준의 제품 개발"은 MISRA-C:2004와 MISRA AC AGC를 언급한다.
* ISO 26262-6:2018 "파트 6: 소프트웨어 수준의 제품 개발"은 MISRA C:2012를 언급한다.
* AUTOSAR 일반 소프트웨어 사양(SRS_BSW_00007) 또한 MISRA C를 언급한다.
* AUTOSAR 4.2 일반 소프트웨어 사양은 "BSW 모듈 구현이 C 언어로 작성된 경우 MISRA C:2004 표준을 준수해야 합니다."라고 요구한다.
* AUTOSAR 4.3 일반 소프트웨어 사양은 "BSW 모듈 구현이 C 언어로 작성된 경우 MISRA C:2012 표준을 준수해야 합니다."라고 요구한다.

9. 관련 표준 및 문서

MISRA C는 여러 관련 표준 및 문서를 가지고 있으며, 시간이 지남에 따라 발전해 왔다. 주요 표준 및 문서는 다음과 같다.

* 초안 및 초기 버전:
* 1997년: 초안
* 1998년: 초판 (MISRA-C:1998) 발행. 127개의 규칙(93개 필수, 34개 권장) 포함.
* 2004년: 2판 (MISRA-C:2004) 발행. 142개의 규칙(122개 필수, 20개 권고) 포함. 규칙 재정렬 등 많은 변경 사항 적용.

* MISRA C:2012 (3판):
* 2013년 발행. C99 지원 확장 및 여러 개선 사항 포함.
* 143개 규칙과 16개 지침 포함. 규칙은 '필수', '요구됨', '권고'로 분류되며, '단일 번역 단위' 또는 '시스템'으로 분류됨. 또한 '결정 가능' 또는 '결정 불가능'으로 분류됨.

* MISRA C:2012 부록:
* MISRA C:2012 - 부록 1: 규칙 매핑: MISRA C:2004와 새로운 버전 간의 양방향 규칙 매핑 제공.
* MISRA C:2012 - 부록 2: ISO/IEC TS 17961:2013 "C Secure"에 대한 MISRA C:2012의 적용 범위
* MISRA C:2012 - 부록 3: CERT C에 대한 MISRA C:2012의 적용 범위

* 개정판:
* 2016년: MISRA C:2012 - Amendment 1: 추가 보안 가이드라인 발행. 14개의 새로운 보안 지침 추가.
* 2020년: MISRA C:2012 - Amendment 2: ISO/IEC 9899:2011/18 핵심 기능 업데이트 발행. C11/C18 내에서 정의되지 않은, 명시되지 않은, 그리고 구현에 따라 정의되는 동작에 대한 매핑 추가.
* 2023년: MISRA C:2023 (MISRA C 제3판, 제2 개정판) 발표. C11 및 C17 언어 기능 지원, 수정 사항 2–4(AMD2, AMD3, AMD4) 및 기술 정정 사항 2(TC2) 통합.

* 기타 관련 문서:
* MISRA 준수: 2016년, 2020년 업데이트
* Approved Deviation Compliance (ADC) version 1.0: MISRA Forum에서 다운로드 가능. 규칙에서 벗어나는 것이 신뢰성이 높은 경우에 대한 문서화 절차 안내.
* 매트랩에서 자동 생성된 프로그램에 대한 Misra AutoCode
* C++(C++) 언어에 대응하는 MISRA C++ 지침
* "Safer C"
* "C 프로그래밍의 함정"
* CERT C, CERT C++: 소프트웨어 엔지니어링 연구소(Software Engineering Institute, SEI)에서 관리하는 코딩 표준.
* ISO/IEC TS 17961: 국제 표준 코딩 표준 기본 문서.

MISRA C 문서는 유료로 판매되고 있다. 자동차 기술회에서 일본어판인 JASO 기술 페이퍼 "자동차용 C 언어 이용 가이드라인"을 판매하고 있다. SESSAME의 MISRA C 연구회가 작성한 규칙 해설서도 일본 규격 협회에서 발행하고 있으며, 오탈자는 SESSAME 웹사이트에 게재되어 있다.

새로운 소프트웨어 프로젝트를 시작할 때는 최신 MISRA 표준을 사용하는 것이 권장된다.