기술인사이트

기술리포트

IEC 61508과 MISRA-C 및 해당 표준 룰셋 기반의 정적분석 테스트 방법 소개 ②
[목 차]
1. 서론
2. IEC 61508이란
3. IEC 61508의 용어 정리
4. IEC 61508 내용
5. MISRA-C(The Motor Industry Software Reliability Association)란?
6. 도구를 활용한 정적 분석 테스트
7. 결론 및 시사점

지난 ①편에서는 IEC 61508이 무엇인지 정의와 목적 그리고 관련 용어를 정리해 보았는데요, 본 포스팅에서는 조금 더 심화된 내용을 다루고자 합니다. MISRA-C가 무엇인지 배경부터 정의, 필요성 그리고 도구를 활용한 예시도 소개하겠습니다.
지난 IEC 61508과 MISRA-C 및 해당 표준 룰셋 기반의 정적분석 테스트 방법 소개 ①을 보고 싶으신 분들은 여기를 클릭하시면 해당 리포트로 이동합니다.
________________________________________


5. MISRA-C(The Motor Industry Software Reliability Association)란?

지금까지 61508에 대해 대략적으로 알아보았습니다. 그렇다면 MISRA-C는 61508과 도대체 어떤 관계일까요?
그 해답은 61508-7의 부속서B-1 Design and coding standards 표 가장 첫 번째 줄에서 ‘코딩 표준 사용’이라 할 수 있습니다. 게다가 SIL1 ~ 4까지 HR(High Recommend) 즉, 강제하고 있습니다. 와이즈스톤에서는 IEC 61508 인정 확대 시 ‘C언어 대한 표준’으로 ‘MISRA-C’를 채택하였습니다. 안전성과 관련된 코드에서 에러 발생 가능성을 줄이기 위한 목적이며 안전에 관련된 임베디드 소프트웨어를 코딩하기 전에 지켜야 할 상세 규칙들에 대해 충분한 협의 필요하기 때문에 모든 안전 무결성 레벨에서 코딩룰이 강제됩니다.


○ 배경 및 정의

MISRA-C는 The Motor Industry Software Reliability Association의 약자입니다. 자동차 산업에서 안전 관련 소프트웨어를 개발하는 개발자의 실수에 대한 위험을 제거하기 위한 C 언어의 규칙을 정의한 것이 시초이며 현재는 우주항공, 의료장비, 국방 등 다양하게 적용되는 가이드라인이며 보안 및 안전 요구 사항이 있는 애플리케이션에도 적용이 가능합니다.

○ 필요성

다양한 프로세서에서 C 컴파일러가 사용되며 효율적인 기계 코드로 컴파일이 가능한 것이 가장 큰 이유입니다. 또한 국제 표준에 의하여 정의되며 광범위한 정적 분석 테스트 도구에서 C언어가 지원되고 있습니다. 하지만 결코 C 언어가 완벽하여 광범위하게 사용되는 것이 아니기에 컴파일러와 프로그래머가 검사하기 힘든 부분의 c언어 단점을 보완하기 위하여 이와 같은 코딩 룰이 필요합니다.


○ 구성 및 내용

• Mandatory Rule : 예외 없이 직관적이고 명확한 규칙이며 어떤 상황에서도 예외 없음
• Require Rule : MISRA-C 적용하는 코드는 반드시 모든 Require Rule을 준수해야 하나 정당한 사유가 있을 시 예외 가능
• Advisory Rule : 권장사항이지만 ‘무시해도 된다’가 아닌 합리적인 준수 필요를 의미함
- C 프로그램을 개발하는 사람들을 위한 교육자료
- 기존 지침 사양과 근거 보완, 불충분한 근거의 지침 제거
- 도구 개발자를 위한 참조 자료
- 정적 분석 도구로 처리 가능한 지침 추가
- 자동 생성 코드에 대한 지침 적용 가능성 제공
- 코딩 규칙은 알려진 잠재 결함을 줄일 수 있는 안전한 언어 서브셋(Subset)을 정의
다음은 제 책상 위에 있는 MISRA-C 원문 중 일부입니다. 상단에는 해당 룰에 대한 간략한 정보가 나와있고 Amplification에서는 코딩 규칙 요구사항의 상세한 설명을 기술하고 있습니다. 그 밑으로는 Rationale에서 규칙이 필요한 이유에 대한 설명이 있고 예외적으로 규칙의 요구사항이 적용되지 않는 특정 상황을 Exceptions에서 설명하고 있습니다. 마지막으로 이해를 돕기 위해 Examples에서 준수 및 위반에 대한 코드 예제를 포함하고 있습니다.



○ 사용

MISRA-C는 산업이나 조직, 프로젝트 성격에 따른 프로그래밍 스타일 및 매트릭에 관한 지침이 아님을 이해하셔야 합니다. 사용 시 무엇보다 중요한 것은 개발 오류를 줄이기 위해 프로젝트 초기에 채택되어야 한다는 것입니다. 문서화된 소프트웨어 개발 프로세스 내에서 사용되며 검토 및 단위 테스트 전 프로그래머에 의하여 사용되어야 합니다. 만일 수명주기 이후에 적용할 시 재코딩, 재검토, 재테스트 하는데 상당한 시간과 자원을 소비하게 되기 때문입니다. 참고로 만일 MISRA-C 기준의 코드 수정이 바람직하지 않는 경우 룰을 준수하지 않은 이유에 대해 전문기관의 기록 검토가 필요합니다.

○ 한계

방대한 양의 코드 중 프로그래머나 컴파일러가 위배 사항을 검출하는 것은 한계가 있습니다.
이로 인하여 정적 분석 도구에 MISRA-C를 적용하여 코딩룰을 위배한 코드를 자동 분석하고 있습니다. 다음과 같은 이유로 자동 분석은 필수입니다.


그러나 ‘Rule 3.2 : 문자 집합(character set)과 관련된 인코딩은 문서화되어야 한다.‘ 와 같이 소스 코드 분석 이외의 규칙들이 있기에 자동 분석 도구에만 의존할 수는 없습니다. 검출 결과에 대해 프로그래머의 정오탐 작업이 필요하기도 합니다.
이전 버전인 MISRA C:2004에서는 이처럼 정적 분석 도구가 검사할 수 없는 여러 규칙들이 존재하였고 이러한 부분들을 명확하게 구분하기 위해 Directive와 Rule로 분할하여 MISRA C:2012가 개편되었습니다.




6. 도구를 활용한 정적 분석 테스트

현재 와이즈스톤에서는 슈어소프트사의 CODESCROLL™ STATIC을 정적 분석 도구로 채택하여 사용하고 있습니다. 해당 도구는 정적 분석 시간을 단축시키고 결함 수정을 용이하게 해주는 도메인 별 코딩 규칙 검사 자동화 도구입니다. 이 도구를 활용하여 샘플 코드를 대상으로 61508과 MISRA-C 룰셋을 적용하여 위배 사항을 검출하고 리뷰해 보겠습니다.

1) 웹 서버에 접속하여 로그인한 후 오른쪽 상단의 ‘New Project’를 클릭하여 새 프로젝트를 생성합니다.
※ Key 값은 이후에 한 번 더 사용하므로 복사해두시면 좋습니다.



2) 생성된 프로젝트를 확인한 후 분석에 사용할 룰셋만 on으로 설정합니다.



3) 분석대상 코드가 저장되어 있는 링크를 확인합니다.


4) ‘STATIC Client for C, C++’을 실행한 후 상단 ‘New Project’를 클릭하여 분석 대상 코드가 저장되어 있는 폴더 선택합니다




5) ‘Server’ 탭에서 Server Address와 Project Key 값, ‘Capture’탭에서 각 항목별로 이미지와 동일하게 값을 입력합니다. ※ gcc 6.3 - none / Parsing Configuration 경로 추가 순서 유의(C++ 탭 동일)




6) ‘Captured Data’탭으로 이동한 후 ‘Capture’버튼을 클릭하고 ‘Analyze’ 버튼을 클릭하여 분석 진행 및 분석 결과를 웹서버로 전송합니다.



7) 다시 웹으로 돌아와서 해당 프로젝트를 클릭하여 분석 결과를 확인합니다. 


8) 위배된 사항을 하나 골라봅시다. 하기 이미지는 goto문을 사용하여 검출된 61508 룰셋 위배 사항입니다. 해당 코드가 구현된 파일, 동일한 룰셋을 위반한 코드의 횟수나 위험도별, 룰셋별, 파일별로도 구분하여 확인할 수 있고 이를 요약 레포트로도 다운로드 가능합니다.








7. 결론 및 시사점

IEC 61508과 MISRA-C에 대하여 알아보았습니다. 애플리케이션이나 생활가전부터 자동차, 국방, 우주 산업에 이르기까지 다양한 산업에서 전자/전기/프로그램 가능한 제품의 비중이 날로 확장되고 있으며 특히 생명과 직결되는 산업에 적용되는 SW의 신뢰성이 중요해지고 있습니다. 요구사항 단계에서 충분한 기간 동안 위험원 분석 및 리스크 평가를 통해 기능 오작동 및 사고 발생률을 줄이고 안전성을 확보하는 것이 가장 효율적인 방법이라 생각됩니다.

이번 포스팅에서는 개념과 전체적인 이해를 위주로 설명드렸다면 다음 포스팅에서는 IEC 61508의 부속서 C 내용과 MISRA-C의 Directive와 Rule의 세부 내용들에 대하여 다뤄보겠습니다.


8. 참고

• MISRA C:2 012 Guidelines for the use of the C language in critical systems
• IEC 61058 기반 산업일반 분야 SW안전 가이드 배포본(2020.01.02.07).pdf

감사합니다!