반응형

MISRA-C++ 2008

  • 고안전(safety-critical) 시스템 개발에 C++ 사용이 증가함에 따라 안전한 시스템 개발을 위한 코딩 가이드라인이 필요해짐
  • 2008년에 고안전 시스템에서 C++ 언어 사용 가이드라인(Guidelines for the use of the C++ language in critical systems)”이라는 제목으로 발표됨
  • MISRA-C: 2004의 일부 규칙들과 C++ 고유의 새로운 규칙을 추가한 총 228개 규칙으로 구성됨


MISRA-C++ 규칙의 예

Rule 16-0-4 (필수) 함수 매크로는 정의하지 않는다(Function-like macros shall not be defined).

) #define FUNC_MACRO(X) ((X)+(X)) //표준에 어긋남

 

Rule 15-1-2 (필수) NULL을 직접 쓰로우 하지 않는다(NULL shall not be thrown explicitly).

)  try {

throw(NULL);               //표준에 어긋남

} catch (int32_t i) {              //throw(NULL)integer 핸들러에 의해서만 잡힘


} catch (const char_t *) {
     //개발자는 여기에서 NULL exception이 잡히기를 의도

}


고안전 시스템에서 C++ 사용 시 이슈(Issues with C++ in Safety-Critical Systems)

MISRA C++ 코딩 표준은 아래와 같은 주요 특징을 가진다.

  • Preprocessor: 프리프로세서의 사용을 강력히 제한함. include guard 구현을 제외한 다른 목적의 매크로 사용은 금지(, 상수 정의, 인라인 매크로 정의)
  • Implementation-defined, unspecified or undefined behavior: C++ 표준이 모든 언어 구성소(language constructs)에 대한 명확한 동작 명세를 한 것은 아니므로 컴파일러 구현에서 자유롭게 정의된(implementation-defined) 명세되지 않은(unspecified) 또는 표준의 요구사항에서 정의되지 않은(undefined) 동작들이 존재한다. 이러한 동작들에 의존하는 코드는 호환이 되지 않으므로 코딩 표준에서 금지한다.
  • Error-prone language constructs: C++는 에러 코드를 유발하는 경향이 있는 많은 언어 구성소를 허용하므로 코딩 표준에서 이와 관련된 제제를 가한다. ) switch 구문에서 case 레이블의 배치를 제한하거나 또는 default case를 포함한 비어있지 않은 모든 switch-clause를 빠져 나오기 위한 break(또는 throw) 사용을 요구, goto 구문 사용을 엄격하게 금지함
  • Type System: C++ 타입 시스템은 빠져나갈 수 있는 많은 허점을 가지고 있으므로 정보 손실을 초래할 수 있는 직접 또는 간접적인 타입 전환(캐스트)을 코딩 표준에서 엄격하게 제제한다.
  • Classes: 코딩 표준에서 클래스의 멤버 변수를 private으로 하여 바람직하지 않은 접근을 금지하는 encapsulation을 강조하고, multiple interface classes 사용을 제외한 multiple inheritance는 피하도록 한다.
  • Dynamic Memory: 일반적으로 고안전 시스템에서 동적 메모리 또는 new, delete 같은 힙 메모리(heap memory) 사용은 엄격하게 금지된다.


반응형

+ Recent posts