MISRA C 2012와 MISRA C2 비교 - 전환 방법

Secure Code Warrior는 항상 교육 범위를 확장하고자 노력하고 있습니다. 임베디드 개발자와 보안 관리자가 안전한 임베디드 시스템을 구축할 수 있도록 지원하기 위해, 당사는 임베디드 시스템 보안 분야로 영역을 넓히고 있습니다. 이 게시물에서는 MISRA C 2012 표준에 대해 알아보고, 안전한 임베디드 시스템 구축에 있어 왜 이 표준을 준수해야 하는지 살펴보겠습니다.
C 언어로 코드를 작성하다 보면 겉보기에는 문제가 없어 보이지만 실제로는 근본적인 오류를 포함하고 있는 코드를 구현하기가 매우 쉽습니다. 코드가 문제없이 컴파일되고 일정 기간 동안은 잘 작동할 수도 있습니다. 하지만 입력 데이터의 크기가 커지거나 메모리 사용량이 늘어나면 동일한 코드에서 충돌이 발생하거나 정의되지 않은 동작이 나타날 수 있습니다. 예를 들어, 특정 입력값으로 인해 정수 오버플로가 발생하거나, 특정 문자열 시퀀스로 인해 배열 범위를 벗어나는 현상이 발생할 수 있습니다.
이때 MISRA C 코딩 표준이 도움이 될 수 있습니다. 이 표준에서 제시하는 규칙, 가이드라인 및 모범 사례를 통해 개발자는 임베디드 개발을 위한 안전하고 신뢰할 수 있는 C 코드를 작성할 수 있습니다.
최신 버전인 MISRA C 2012는 새로운 규칙을 추가하고 기존 규칙을 개선했으며, 일부 불일치 사항을 해결했습니다. 아직 이전 버전을 사용 중이라면 지금이 새로운 표준으로 전환하기에 가장 좋은 시기입니다.
MISRA C 코딩 표준이란 무엇인가요?
MISRA C 표준은 C 프로그래밍 언어를 위한 코드 안전성, 이식성 및 신뢰성 가이드라인을 포함합니다. 첫 번째 가이드라인 세트는 1998년에 발표되었으며, C 언어에 특화된 내용이었습니다.
하지만 그 이후로 MISRA 컨소시엄은 C++를 위한 코딩 표준도 개발해 왔습니다. 모든 MISRA C 문서에는 규칙 세트, 비준수 사례, 그리고 해당 규칙이 개발된 배경 정보에 대한 상세 섹션이 포함되어 있습니다.
C와 C++는 임베디드 소프트웨어 개발에 가장 널리 사용되는 언어입니다. 그 주된 이유 중 하나는 기계어보다 1~2단계의 추상화만 거치므로 속도가 빠르기 때문입니다. 하지만 이는 곧 C 언어로 안전한 코드를 작성하기가 어렵고 오류가 발생하기 쉽다는 의미이기도 합니다. 예를 들어, Java나 C#과 같은 대부분의 고수준 언어에서는 가비지 컬렉션이나 동적 타이핑과 같은 사소한 문제에 대해 걱정할 필요가 없습니다.
반면 C 언어에는 가비지 컬렉션을 위한 사전 정의된 방법이 없습니다. 즉, 데이터 구조를 위해 메모리를 할당했다면 사용이 끝난 후 직접 수동으로 해제해야 합니다. 그렇지 않으면 다른 언어와 달리 C 언어는 메모리를 자동으로 해제해주지 않으며, 이는 메모리 누수로 이어집니다.
MISRA C 2004(C2) vs. MISRA C 2012(C3) – 무엇이 바뀌었나요?
C3라고도 불리는 MISRA C: 2012는 2013년 4월에 처음 출시되었습니다. 수천 명의 전문가와 조직의 지식을 바탕으로 만들어진 C3는 새로운 규칙을 추가하고, 기존 규칙에 대한 설명과 배경을 보강했으며, 일부 허점을 보완했습니다.
C3는 C99 버전을 지원하면서도 이전 ISO C90에 대한 규칙을 유지합니다. C3의 주요 초점은 규칙 준수에 드는 비용을 절감하는 동시에, 중요한 시스템에서 C 언어를 더 안전하게 사용할 수 있도록 만드는 것이었습니다. 이러한 이유로 아직 전환하지 않았다면 새로운 표준으로 전환하는 것이 현명합니다.
가장 중요한 변경 사항은 다음과 같습니다.
- 2004 버전에서 발견된 문제 수정.
- 결정 가능한 규칙의 수를 대폭 증가.규칙은 분석 도구를 통해 준수 여부를 판단할 수 있는 경우 결정 가능하다고 합니다.
- 규칙은 “필수(required)”, “권장(advisory)”, “강제(mandatory)”로 분류됩니다. 강제 규칙은 어떤 상황에서도 절대 위반해서는 안 됩니다. 필수 및 권장 규칙은 위반에 대한 정당한 사유가 있다면 특별한 상황에서 예외적으로 위반할 수 있습니다.
- 자동 생성 코드에 규칙을 적용하는 방법에 대한 지침 추가. 이는 사람이 작성한 코드에 적용되는 가이드라인이 도구로 생성된 코드에는 항상 적용되지 않을 수 있기 때문에 매우 중요합니다.
- 합리적인 사용자 행동을 금지하던 지나치게 일반적인 규칙 제거. 예를 들어, 이전에는 매크로가 다양한 어려움과 혼란(디버깅 불가, 네임스페이스 부재 등)을 초래할 수 있다는 이유로 사용하지 않는 것이 권장되었습니다. 이로 인해 매크로가 우아하고 안전하며 편리한 해결책이 될 수 있는 상황에서도 사용이 제한되었습니다. MISRA C: 2012에서는 매크로에 관한 새로운 규칙이 도입되어, 적용 가능한 경우 신중하게 사용할 수 있게 되었습니다. 함수보다 매크로 사용을 권장하는 MISRA C 문서의 다음 발췌 내용을 확인해 보세요.

실전 MISRA C 규칙
설명은 충분합니다. 이제 몇 가지 MISRA C 규칙을 실제로 적용해 보며 실습할 시간입니다.
memcpy, memmove, memcmp의 포인터 인자에는 호환 가능한 타입을 사용하십시오
표준 라이브러리 함수인 memcpy, memmove, 및 memcmp 는 지정된 바이트 수만큼 바이트 단위로 이동하거나 비교합니다. MISRA C 2012 표준의 규칙 21.15는 두 함수 매개변수가 동일한 타입에 대한 포인터여야 한다고 규정합니다. 호환되지 않는 포인터 타입으로 함수를 호출하면 오류가 발생할 수 있습니다.
공식 MISRA 준수 문서에서 발췌한 다음 이미지를 참조하십시오. 이 규칙은 필수(required) 및 결정 가능(decidable) 항목이며 C90과 C99 모두에 적용됩니다.

규칙 설명 뒤에 예시가 이어집니다.

보시다시피 객체의 타입이 서로 다르기 때문에(uint8_t 및 uint16_t), 이는 규칙을 준수하지 않는 사례입니다.
길이를 입력받지 않는 문자열 처리 함수는 범위를 벗어난 접근을 유발해서는 안 됩니다
<string.h>에서 길이를 입력받지 않는 문자열 처리 함수는 범위를 벗어난 접근을 유발해서는 안 됩니다. 관련 함수는 strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr, strtok입니다. 이 규칙은 강제(mandatory) 합니다.결정 불가능(undecidable)

관련 예시는 다음과 같습니다:

보시다시피, f1 함수 내의 strcpy는 5자만 저장할 수 있는 문자열의 길이를 초과하여 복사합니다. 또한, "str"의 내용이 들어갈 수 있는 경우에만 복사가 이루어지도록 하는 안전하고 준수된 strcpy 사용 예시도 있습니다.
외부에서 수신된 데이터 검증
지침 4.14는 "외부" 소스에서 수신된 데이터의 유효성을 확인할 것을 권장합니다. 외부 입력은 다음과 같을 수 있습니다:
- 파일에서 읽은 데이터.
- 환경 변수에서 읽은 데이터.
- 사용자 입력.
- 통신 채널을 통해 수신된 모든 데이터(예: TCP 연결 또는 HTTP API 등).
이 지침은 필수(required) 범주에 속하며 C90과 C99 모두에 적용됩니다. 그 이유는 프로그램이 외부 소스에서 수신된 데이터를 제어할 수 없으며, 따라서 해당 데이터가 유효하지 않거나 악의적일 수 있기 때문입니다. 예를 들어, 프로그램은 사용자가 숫자를 입력할 것으로 예상하지만 사용자가 문자열을 입력할 수 있습니다. 입력을 처리하기 전에 프로그램은 해당 데이터가 실제로 숫자인지 확인해야 합니다.

MISRA C 2012로 전환하는 방법
MISRA C 2012로 전환하려면 코딩 가이드라인 문서를 업데이트해야 합니다. 만약 별도의 문서를 사용하지 않고 정적 분석 도구(권장되는 방식)에 의존하고 있다면, 도구의 최신 버전을 확보해야 할 수 있습니다. 다음은 MISRA C 2012 준수 여부를 확인하는 세 가지 도구입니다:
- Cppcheck는 MISRA 규칙을 확인하고 다양한 종류의 버그를 탐지할 수 있는 오픈 소스 도구입니다.
- PC-lint Plus는 30일 평가판을 제공하는 유료 도구입니다. MISRA C 준수 여부 확인 외에도 잠재적인 버그와 취약점을 식별하는 데 도움을 줍니다.
- CodeSonar는 MISRA C 및 C++ 준수 여부를 모두 확인하는 또 다른 도구입니다.
MISRA 준수 여부를 테스트할 수 있는 컴파일러도 몇 가지 있습니다. 규칙 위반이 감지되면 그에 따라 경고나 예외가 발생합니다. 예를 들어, Green Hills Software는 32비트 및 64비트 아키텍처 모두에 대해 모든 MISRA 표준을 지원하는 컴파일러를 제공합니다.
Secure Code Warrior를 활용한 개발자의 MISRA C 역량 강화
Secure Code Warrior의 주력 제품인 학습 플랫폼에는 개발자가 안전한 C/C++ 코드를 작성하도록 훈련할 수 있는 수많은 대화형 챌린지, 과정 및 평가가 포함되어 있습니다. 플랫폼의 콘텐츠는 프레임워크별로 구성되어 있으며 참여도가 매우 높습니다. 당사의 C/C++:Embed 코딩 챌린지는 MISRA C, AUTOSAR C++(MISRA C++), IEC에서 영감을 받았습니다.
개발자는 개인화된 학습 여정을 시작하여 C/C++ 관련 취약점을 식별하고, 더 나아가 해당 버그를 수정하는 방법을 배울 수 있습니다. 이 과정에서 개발자는 자신의 진행 상황을 추적하여 약점을 파악하고, 동료들과 친선 코딩 경쟁을 즐길 수도 있습니다. 당사의 솔루션이 자동차 및 운송 산업을 어떻게 지원하는지 자세히 알아보십시오.
저희 챌린지가 얼마나 인터랙티브하고 임베디드 중심적인지 궁금하신가요? C/C++:Embed 챌린지를 지금 바로 학습 플랫폼에서 경험해 보세요!
배포 전 AI 기반 개발 거버넌스 확보
AI 기반 위험을 측정하고, 커밋 시점에 보안 코딩 정책을 적용하며, SDLC 전반에 걸쳐 안전한 소프트웨어 제공 속도를 높이세요.
더 많은 블로그 살펴보기
보안 코딩, AI 거버넌스, 소프트웨어 리스크 관리에 관한 전문가 콘텐츠를 확인해 보세요.
%252520%252520(3).avif)
Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Security as culture: How Blue Prism cultivates world-class secure developers
Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed
배포 전 AI 기반 개발 보안 확보
소프트웨어 개발 수명 주기 전반에서 개발자 리스크를 파악하고, 정책을 시행하며, 취약점을 예방하세요.



.avif)