반응형

 

  • MISRA(The Motor Industry Software Reliability Association)는 자동차 소프트웨어의 '안전성(safety)' 증진을 위한 영국의 한 단체 
  • 1998년 MISRA가 C 언어의 애매성(ambiguities)을 다루고 자동차 산업계를 위한 코딩 규칙을 세운 가이드라인 “Guidelines for the Use of the C Language in Vehicle Based Software”를 출판함
  • 이 가이드라인은 127개 규칙을 포함하고 있으며 이중 93개는 필수 사항 나머지 34개는 권고사항임. 모든 규칙들은 컴파일러에 의해 생성된 오브젝트 코드가 아니라 소스 코드에 적용됨

 

MISRA-C: 1998

  • C 언어 사용 관련 규칙들을 정리한 코딩 가이드라인. 문서명은 자동차 기반 소프트웨어에서 C 언어 사용을 위한 가이드라인(Guidelines for the use of the C language in vehicle based software)”
  • 임베디드 시스템(특히 자동차 시스템)에서 C 언어 사용이 증가함에 따라 엔지니어가 해당 언어의 알려진 이슈나 결함을 이해하고 이를 사전에 방지하여 안전한 시스템을 개발할 수 있도록 하기 위한 목적
  • 자동차 산업 분야의 여러 회사가 참여하는 협업 그룹인 MISRA(the   Motor   Industry   Software   Reliability Association)에서 개발
  • 1998년 발표된 이래 자동차 산업 분야 뿐만 아니라 항공 및 의료 분야에서도 MISRA C 표준이 널리 사용됨
  • ISO/IEC 9899:1990 C 언어 표준을 기반으로 한 MISRA C 1988년 버전은 총 127개의 규칙으로 구성됨(93개 필수 규칙, 34개 권고 규칙)

 

아래는 MISRA-C: 1998에 포함된 코딩 규칙의 예이다.

  • Rule 30: 초기화 안된 오브젝트는 사용하지 않는다(Uninitialised   objects   shall   not   be   used).
  • Rule 34: && 또는 || 논리 연산자의 피연산자는 일차식이여야 한다(The operands of a logical && or || shall be primary expressions).
  • Rule 35: 부울 값을 반환하는 식에서는 지정 연산자를 사용하지 않는다(Assignment operators shall not be used in expressions which return Boolean values).

 

MISRA-C: 2004

  • MISRA-C 1998년 버전의 단점(명확하지 않은 규칙, 의미 해석이나 적용이 어려운 규칙 등)을 개선하려는 노력이 이루어짐
  • 2004 10고안전 시스템에서 C 언어 사용 가이드라인(Guidelines for the use of C language in critical systems)”라는 제목으로 MISRA-C: 2004 발표
  • 기존 규칙 중 일부 삭제와 새로운 규칙 추가를 통해 MISRA C 2004에는 총 141개 규칙이 포함됨(121개 필수 규칙과 20개 권고 규칙)

 

프로그래밍 언어의 불안전성과 C 언어(Language insecurities and the C language)

아래와 같은 문제들 때문에 최종 실행 코드(the final executable code)가 항상 프로그래머가 의도한대로 동작한다고 보장할 수 있는 프로그래밍 언어는 없다.

  • 프로그래머의 실수: 단순 타이핑 에러부터 알고리즘을 잘못 이해하는 등의 프로그래머 에러가 있을 수 있다. 예를 들어, 논리 비교 연산자 ‘==’ 대신 지정 연산자 ‘=’를 쓴다든지 엄격한 타입 체킹 결여로 인한 예기치 못한 결과는 C에서 자주 생기는 문제들이다.
  • 프로그래머가 언어를 잘못 이해: 프로그래머가 언어 구성소의 원리를 잘못 이해하여 오류를 범할 수 있다. 예를 들어 C의 경우 연산자들의 우선순위 규칙이 복잡하여 프로그래머가 이와 관련된 실수를 하기 쉽다.
  • 컴파일러가 프로그래머가 예상한 것과 다르게 동작: C 언어에 완전하게 정의되지 않은 영역이 여러 군데 있어서 컴파일러마다 이를 다르게 해석 할 수 있다. , 컴파일러에 따라 동작이 달라질 수 있다.
  • 컴파일러 자체의 에러: 언어 컴파일러도 결국은 소프트웨어 도구이므로 항상 코드를 올바르게 컴파일 하란 법은 없다. 특정 상황에서 컴파일러가 언어 표준을 준수하지 않는다거나 또는 자체에 버그를 포함하고 있을 수 있다(, 컴파일러 작성자가 C 언어 표준을 잘못 해석하고 컴파일러를 부정확하게 구현함).
  • 런타임 에러: C 코드는 작고 효율적인 대신 컴파일 된 코드의 실행 중 생긴 문제를 발견하고 적절한 조치를 취하는 런타임 체킹에 취약. 대개의 C 컴파일러가 산술 예외 사항(0으로 나누기), 오버플로우, 포인터 주소 유효성, 어레이 바운드 에러 같은 문제에 대한 런타임 체킹을 제공하지 않는다.

 

위와 같은 이유로 높은 안전성이 요구되는 시스템에서 C 언어를 사용할 때는 많은 주의가 요구되며, C의 모든 기능을 완전하게 사용하는 대신 안전한 부분 집합 만을 사용하는 것이 관행이다(, 알려진 문제점/이슈들을 피하도록 언어 사용에 있어 제약을 준다). MISRA는 이러한 C 언어의 부분 집합을 식별하여 자동차 분야 시스템의 안전성(safety), 이식성(portability), 신뢰성(reliability)을 향상하는 것을 목표로 한다.

 

 

MISRA C 표준 준수를 위한 정적 체킹 도구(Static Checking Tools)

  • MISRA C 코딩 표준을 준수하면 안전하지 않거나 신뢰성이 떨어지는 코딩 구조 사용을 방지하여 소프트웨어 품질을 향상할 수 있지만 도구의 지원 없이 MISRA 표준 준수를 보장하는 것은 거의 불가능하다.
  • 따라서 자동 도구(MISRA C 체커)를 활용하여 애플리케이션 소스 코드가 MISRA C 코딩 표준을 준수하는지 체크한다(, 소스 코드 중 MISRA C 코딩 규칙을 위반하는 라인을 도구가 자동으로 식별하여 보여줌).
  • MISRA C 체킹 도구가 제공하는 표준 준수 레벨(the compliance level)이 다양함.
    ) MISRA-C: 2004를 지원하는 도구 중 124개 규칙 준수 여부를 확인 해 주는 도구도 있고 106개 규칙만을 확인하는 도구도 있다(MISRA C 2004 141개 규칙 중 소프트웨어 도구로 확인하기 어려운 것들도 있어서 100% 완전 체크는 불가능)

 

[MISRA C 체커 예]

 

위 MISRA C 체커가 IAR C 컴파일러에 완전히 통합되어 있음. IAR Embedded Workbench로부터 사용자는 어떤 MISRA C 규칙을 체크할지 선정할 수 있고 이 세팅이 컴파일러와 링커 모두에서 사용됨. 사용자가 비활성화 시키지 않는 한 필수 또는 권장 규칙에서 벗어나는 모든 경우마다 메시지가 생성되며, 각 메시지는 어떤 MISRA C 규칙에서 벗어났는지 아래 예처럼 표시해 준다.

Error[Pm088]: pointer arithmetic should not be used (MISRA C rule 101)

 

MISRA C 견본 테스트 케이스 집합(THE MISRA-C EXEMPLAR TEST SUITE)

  • MISRA C 지원 도구를 위한 공식 인증 프로그램은 없지만 MISRA 협회에서 발표한 견본 테스트 케이스 집합(사전 정의된 테스팅 결과들을 가진 소스 코드 파일 집합)을 사용하여 특정 도구가 어느 정도 MISRA C 표준 준수 레벨을 제공하는지 측정 가능
  • 이 견본 집합에는 하나의 MISRA C 규칙을 테스트 하는 케이스가 하나 이상 존재하는 경우도 있어서 MISRA C 규칙의 수 보다 테스트 케이스의 수가 더 많다

 

반응형

+ Recent posts