본문 바로가기

카테고리 없음

CppCheck misra.py Addon 확장을 통한 MISRA C:2012 Dir 4.6 검출 추가

개요

CppCheck는 misra.py addon을 제공하고 있으며, 이를 통해 몇가지의 Guideline(rule)들을 검출할 수 있다. 이를 확장하여 원하는 추가 Guideline을 개발할 수 있었다. 그 중 가장 간단히 추가할 수 있는 Guideline(Directive)는 Dir 4.6이다. int, unsigned int, float, double과 같이 숫자 기본형을 사용하지 말고, typedef를 통해 signedness와 size를 암시하는 새로운 형을 사용하라는 Guideline(Directive) 이다. 이를 검출하기 위해 작업을 수행해보자.

 

typedef signed int	int32_t;
typedef unsigned int uint32_t;
...
typedef double	float64_t;
...

준비사항

설치와 관련된 글은 https://ppiazi.tistory.com/entry/MISRA-C2012-%EB%A5%BC-%EC%9C%84%ED%95%9C-CppCheck-%EC%82%AC%EC%9A%A9 을 참고하자.

구현

misra.py

몇 부분을 수정해야 한다. Directive를 위한 공간이 없어, rule 4.3에 해당내용을 추가하였으니 참고한다.

  •  - : 삭제된 코드
  •  + : 추가된 코드

def generateTable() 수정

--- a/addons/misra.py
+++ b/addons/misra.py
@@ -571,7 +571,7 @@ def generateTable():
     numberOfRules[1] = 3
     numberOfRules[2] = 7
     numberOfRules[3] = 2
-    numberOfRules[4] = 2
+    numberOfRules[4] = 3
     numberOfRules[5] = 9
     numberOfRules[6] = 2
     numberOfRules[7] = 4

 

class MisraChecker / def misra_4_3() 추가

@@ -801,6 +801,13 @@ class MisraChecker:
                     self.reportError(token, 4, 2)
                     break

+    def misra_4_3(self, rawTokens):
+        numerical_primitive_types = ["int", "unsigned int", "short", "unsigned short", "long", "long long", "unsigned long",
+                           "unsigned long long", "float", "double"]
+        for token in rawTokens:
+            if token.str in numerical_primitive_types:
+                self.reportError(token, 4, 3)
+

 

class MisraChecker / def get_verify_expected() 수정

 

@@ -2068,6 +2074,7 @@ class MisraChecker:
                     self.reportError(token, 21, 12)


def get_verify_expected(self):
         """Return the list of expected violations in the verify test"""
         return self.verify_expected
@@ -2509,6 +2516,7 @@ class MisraChecker:
                 self.executeCheck(302, self.misra_3_2, data.rawTokens)
                 self.executeCheck(401, self.misra_4_1, data.rawTokens)
                 self.executeCheck(402, self.misra_4_2, data.rawTokens)
+                self.executeCheck(403, self.misra_4_3, data.rawTokens)
             self.executeCheck(501, self.misra_5_1, cfg)
             self.executeCheck(502, self.misra_5_2, cfg)
             self.executeCheck(503, self.misra_5_3, cfg)

 

misra2012_text.txt 파일 내에 Rule 4.3 관련 내용 추가

  : Directive가 없어 Rule 4.3에 Directive 4.3의 내용을 추가하면 된다.

  ※ 텍스트의 제일 앞 문자는 반드시 대문자여야 한다. -_-;; 이것때문에 몇시간을...

 

테스트

size_t나 int32_t 와 같은 부분은 검출되지 않고, int 등 기본 숫자형을 사용한 부분에 대해 Dir 4.6을 검출하는 것을 확인할 수 있다.