From e840d67f0317491f74c58490e7543392d2adfd8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 14 Apr 2017 12:57:07 +0200 Subject: [PATCH] Misra: Added rule 16.4 --- addons/misra-test.c | 11 +++++++++++ addons/misra.py | 28 +++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/addons/misra-test.c b/addons/misra-test.c index ed6c27896..f53ca7552 100644 --- a/addons/misra-test.c +++ b/addons/misra-test.c @@ -113,6 +113,8 @@ void misra_15_7() { void misra_16_2() { switch (x) { + default: + break; case 1: while (y>4) { case 2: break; // 16.2 @@ -134,3 +136,12 @@ void misra_16_3() { default: break; } } + +void misra_16_4() { + switch (x) { // 16.4 + case 1: + break; + case 2: + break; + } +} \ No newline at end of file diff --git a/addons/misra.py b/addons/misra.py index 54ca6337f..7ae6ead03 100644 --- a/addons/misra.py +++ b/addons/misra.py @@ -25,6 +25,13 @@ def reportError(token, num1, num2): else: sys.stderr.write('[' + token.file + ':' + str(token.linenr) + '] misra ' + str(num1) + '.' + str(num2) + ' violation\n') +def simpleMatch(token, pattern): + for p in pattern.split(' '): + if not token or token.str != p: + return False + token = token.next + return True + # Platform # TODO get this from dump CHAR_BITS = 8 @@ -425,7 +432,6 @@ def misra_16_2(data): if token.str == 'case' and token.scope.type != 'Switch': reportError(token, 16, 2) -# The goal is handle comments/annotations by other tools def misra_16_3(rawTokens): # state: 0=no, 1=break is seen but not its ';', 2=after 'break;', 'comment', '{' state = 0 @@ -445,6 +451,25 @@ def misra_16_3(rawTokens): elif token.str == 'case' and state != 2: reportError(token, 16, 3) +def misra_16_4(data): + for token in data.tokenlist: + if token.str != 'switch': + continue + if not simpleMatch(token, 'switch ('): + continue + if not simpleMatch(token.next.link, ') {'): + continue + startTok = token.next.link.next + tok = startTok.next + while tok and tok.str != '}': + if tok.str == '{': + tok = tok.link + elif tok.str == 'default': + break + tok = tok.next + if tok and tok.str != 'default': + reportError(token, 16, 4) + if '-verify' in sys.argv[1:]: VERIFY = True @@ -499,6 +524,7 @@ for arg in sys.argv[1:]: misra_16_2(cfg) if cfgNumber == 1: misra_16_3(data.rawTokens) + misra_16_4(cfg) if VERIFY: for expected in VERIFY_EXPECTED: