코딩뚠뚠

MISRA C 2012와 특성 본문

공부/기타

MISRA C 2012와 특성

로디네로 2021. 12. 28. 18:20
반응형

 

이전 포스팅에서는 MISRA는 뭔지 MISRA C 코딩룰은 뭔지에 대해 알아봤다

 

 

MISRA C 코딩룰

개발자 누구나 자신만의 코딩룰이 있을것이다. 하지만 현업에선 자신만의 코딩룰보단 개발 테스트 관리를 위한 공통의 룰이 있다는것을 알게됐다. MISRA C 는 그 공통의 코딩룰 중 하나로 아래에

dbstndi6316.tistory.com

 

이번 포스팅에서는 그 중 MISRA C 2012와 그 특성에 대해 조금더 깊게 알아보고자 한다.

 

 


 

왜 규칙을 계속 업데이트 하는가?

이미 MISRA를 사용하는 기업들은 업그레이드에 대해 아래와 같은 의문들을 품을 수 있다.

  • 새로운 규칙이 꼭 필요할까?
  • 이전 규칙보다 월등히 좋은가?
  • 기존 MC1/MC2를 준수한 코드는 새로운 표준도 준수할 수 있을까?

룰이 업데이트 되기 이전에 언어의 버전도 계속 업데이트 되기 때문에 위와같은 의문이 생긴다.

 

이전 버전의 룰은 C90을 따랐지만 MISRA C 2012는 C90을 강요하지 않도록 결정했다.

 

예를들어 C99기능 중 inline 함수와 _Bool 타입과 같은 기능이 가치있는 내용이 인정했기때문이다.

 

이에 따라 룰을 업데이트하는데 어떤 규칙에 따라 업데이트 했는지 내용에 대해 알아보도록 하자.

 

 


 

코딩룰에는 어떤 특성들이 존재할까?


규칙의 정의 (Rule Definition)

MISRA C 2012에는 기존 존재룰이 서로 다른 해석으로 이해되지 않도록 내용이 추가되었다.

  • Amplification - 코딩 규칙 요구 사항의 상세한 설명
  • Rationale - 규칙이 필요한 이유에 대한 설명
  • Exceptions - 규칙의 요구 사항이 적용되지 않는 특정 상황
  • Examples - 준수 및 위반에 대한 코드 예제

 


 

 

용어 (Jargon)

코딩 규칙을 정의하는데 추가적인 용어 도입이 필요할 수 있다.

ex) type

MC2
underlying type C++에서 다른 의미로 사용됨
complex expression 일반적으로 C99에서 지원되는 대수를 의미하는데 사용됨
MC3
-> essential type 산술 표현의 타입을 설명할 때 더 직관적이다.
-> composite expression 모호한 표현을 벗어남

 


 

필수규칙 (Mandatory Rules)

 

이전버전은 두 카테고리로 룰을 분류했다. (Required Rules, Advisory Rules)

또한 정식 예외사항이 아닌 이상 모든 Required Rules을 준수해야만 한다.

Advisory Rules는 완화된 항목이며, 정식 예외는 선택 적용되었다.

이는 주관적인 판단이 반영되는데 아래와 같은 요소들을 고려해야한다.

  • 코딩 규칙의 위반이 소프트웨어 결함을 얼마나 발생시키는가?
  • 코딩 규칙의 위반이 얼마나 자주 발생하는가?
  • 코딩 규칙이 안전한 코드에 대해 irksome(귀찮은) 제약사항을 요구하는가?

하지만 일부 규칙들은 예외 없이 명확하다. MC3는 이들을 Mandatory Rules로 분류하며 예외가 허용되지 않는다.

 

 


 

시행가능성 (Enforceability)

 

코딩규칙은 잠재결함을 줄일 수 있는 안전한 언어 subset을 정의하는것이다.

정적 분석도구는 코딩 규칙 적용 뿐 아닌 해결되지 않는 에러의 검출을 돕는다.

 

정적분석도구 필요 : 

  1. 불확실성의 제거
  2. 시간 절약
  3. 코드 개발시 빠르게 피드백 제공
  4. 매뉴얼 코드 리뷰와 관련된 문제점 완화

다만 코딩 표준에서 정적으로 실행이 불가능한 규칙이 있다. 문서, 프로세스, 주관적 해석 등이다.

코딩표준이지만 자동분석에 의존할 수 없는 부분들이다.

 

따라서 MC3 에서는 규칙(rules)지침(directives) 용어를 구분했다.

 

규칙은 요구사항에 대한 자세한 설명이 동반되며 정적 분석도구 규칙의 준수를 검사할 수 있어야 한다.

 


 

범위와 준수 (Scope and Compliance)

 

간단한 규칙들은 한 문장의 문법을 검사하는 것으로 쉽게 수행될 수 있지만 복잡한 규칙들은 제어구문, 함수전체, 프로젝트 단위의 분석이 요구된다. 

 

분석의 범위를 설정하기 위해 MC3의 규칙들은 System Rule, Single Translation Unit Rule로 분류된다.

 

 


 

결정 가능성 (Decidability)

 

일부 코딩 규칙은 본질적으로 결정이 불가능(undecidable)하다.

결정이 가능한 규칙(decidable)이란 어떠한 상황에서도 도구를 통해 규칙 위반 규명이 가능한것을 말한다.

아래 두 가지 대답 중 하나가 가능한 것이다.

  1. Yes - 규칙 위반은 분명히 이 시점에서 발생한다.
  2. No - 규칙 위반은 분명히 이 시점에서 발생하지 않는다.

MC3에 있는 모든 규칙들은 명확하게 decidableundecidable로 분류된다.

143개 Rule 중 28개가 undecidable로 분류되며 undecidable 일 때 절대로 준수를 보장할 수 없다.

 


 

마이그레이션 (Migration)

 

MC2를 준수해서 개발한 코드에서 MC3가 영향을 끼치는 경우는 없을까?

영향이 없어야 될 것이다.

 

아래의 제약사항의 경우 코딩규칙의 신뢰성은 훼손될 수 있다.

  • 알려진 소프트웨어 결함을 바로 지적하지 않은 경우
  • 규칙을 회피하는 것이 더 큰 문제를 야기시키는 경우
  • 완벽하게 안전한 코드를 위해 너무 많은 제약을 가하는 경우

MC3에서는 일부 코딩 제약사항을 수정,제거함으로써 완화시켰다.

 

 


 

MISRA C 2004 (MC2) >>> MISRA C 2012 (MC3)

 

MC2에비해 MC3은 문서의 양이 많지만 규칙 수는 많이 증가하지 않았다.

핵심 개선 내용은 아래와 같다.

  • 개선된 규칙의 설명 : 부연설명, 원인, 예외와 예제
  • 규칙과 지침의 구분
  • Mandatory 규칙의 분류
  • 시스템 전체 단위 준수와 Unit 한 개 단위 준수의 구분
  •  결정 가능성에 대한 인식

 


 

코딩룰을 체크해주는 소프트웨어는?

Perforce(구PRQA) 사의 Helix QAC 로 체크할 수 있다.

 

Helix QAC for C and C++ | Perforce

Aerospace, defense, and military organizations use embedded software every day. Making sure that software is safe, secure, and reliable is critical. This puts developers under pressure to produce software without any defects. Large code bases and complex s

www.perforce.com

MISRA C/C++ 뿐 아닌 AUTOSAR C++ 14, JSF AV C++ 도 검증할 수 있다.

 

이는 매우 정확한 언어 분석 및 이해력을 가졌으며, Data Flow 기능과 결합되어있다.

 

이를통해 언어 사용해 의해 발생되는 여러 문제들을 식별하며 코딩룰 준수를 위한 수행방안을 제공한다.

 

 


 

 

참고자료 : 

https://www.autoelectronics.co.kr/article/articleView.asp?idx=1125

https://ko.wikipedia.org/wiki/MISRA_C

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=suresofttech&logNo=220769096265

반응형

'공부 > 기타' 카테고리의 다른 글

REST / REST API / RESTful?  (0) 2022.04.05
엣지컴퓨팅이란?  (0) 2022.03.06
MISRA C 코딩룰  (1) 2021.12.27
생체인증/미래  (0) 2021.11.18
생체인증/개요  (0) 2021.11.18