misra.py: Add rule 20.7
This commit is contained in:
parent
548ddf815c
commit
3e3c805a66
|
@ -444,8 +444,12 @@ def getArguments(ftok):
|
||||||
return arguments
|
return arguments
|
||||||
|
|
||||||
|
|
||||||
|
def isalnum(c):
|
||||||
|
return (c >= '0' and c <= '9') or (c >= 'a' and c <= 'z') or (c >= 'A' and c <= 'Z')
|
||||||
|
|
||||||
|
|
||||||
def isHexDigit(c):
|
def isHexDigit(c):
|
||||||
return (c >= '0' and c <= '9') or (c >= 'a' and c <= 'f') or (c >= 'A' and c >= 'F')
|
return (c >= '0' and c <= '9') or (c >= 'a' and c <= 'f') or (c >= 'A' and c <= 'F')
|
||||||
|
|
||||||
|
|
||||||
def isOctalDigit(c):
|
def isOctalDigit(c):
|
||||||
|
@ -468,6 +472,20 @@ def isNoReturnScope(tok):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class Define:
|
||||||
|
def __init__(self, directive):
|
||||||
|
self.args = []
|
||||||
|
self.expansionList = ''
|
||||||
|
|
||||||
|
res = re.match(r'#define [A-Za-z0-9_]+\(([A-Za-z0-9_,]+)\)[ ]+(.*)', directive.str)
|
||||||
|
if res is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.args = res.group(1).split(',')
|
||||||
|
self.expansionList = res.group(2)
|
||||||
|
|
||||||
|
|
||||||
def generateTable():
|
def generateTable():
|
||||||
numberOfRules = {}
|
numberOfRules = {}
|
||||||
numberOfRules[1] = 3
|
numberOfRules[1] = 3
|
||||||
|
@ -1608,6 +1626,32 @@ class MisraChecker:
|
||||||
self.reportError(directive, 20, 5)
|
self.reportError(directive, 20, 5)
|
||||||
|
|
||||||
|
|
||||||
|
def misra_20_7(self, data):
|
||||||
|
for directive in data.directives:
|
||||||
|
d = Define(directive)
|
||||||
|
exp = '(' + d.expansionList + ')'
|
||||||
|
for arg in d.args:
|
||||||
|
pos = exp.find(arg)
|
||||||
|
if pos < 0:
|
||||||
|
continue
|
||||||
|
pos1 = pos - 1
|
||||||
|
pos2 = pos + len(arg)
|
||||||
|
if isalnum(exp[pos1]) or exp[pos1]=='_':
|
||||||
|
continue
|
||||||
|
if isalnum(exp[pos2]) or exp[pos2]=='_':
|
||||||
|
continue
|
||||||
|
while exp[pos1] == ' ':
|
||||||
|
pos1 -= 1
|
||||||
|
if exp[pos1] != '(' and exp[pos1] != '[':
|
||||||
|
self.reportError(directive, 20, 7);
|
||||||
|
break
|
||||||
|
while exp[pos2] == ' ':
|
||||||
|
pos2 += 1
|
||||||
|
if exp[pos2] != ')' and exp[pos2] != ']':
|
||||||
|
self.reportError(directive, 20, 7);
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
def misra_20_13(self, data):
|
def misra_20_13(self, data):
|
||||||
dir_pattern = re.compile(r'#[ ]*([^ (<]*)')
|
dir_pattern = re.compile(r'#[ ]*([^ (<]*)')
|
||||||
for directive in data.directives:
|
for directive in data.directives:
|
||||||
|
@ -2140,6 +2184,7 @@ class MisraChecker:
|
||||||
self.misra_20_3(data.rawTokens)
|
self.misra_20_3(data.rawTokens)
|
||||||
self.misra_20_4(cfg)
|
self.misra_20_4(cfg)
|
||||||
self.misra_20_5(cfg)
|
self.misra_20_5(cfg)
|
||||||
|
self.misra_20_7(cfg)
|
||||||
self.misra_20_13(cfg)
|
self.misra_20_13(cfg)
|
||||||
self.misra_20_14(cfg)
|
self.misra_20_14(cfg)
|
||||||
self.misra_21_3(cfg)
|
self.misra_21_3(cfg)
|
||||||
|
@ -2273,7 +2318,10 @@ else:
|
||||||
for misra_id in sorted(rules_violated.keys(), key=misra_sort):
|
for misra_id in sorted(rules_violated.keys(), key=misra_sort):
|
||||||
num = misra_id[len("misra-c2012-"):]
|
num = misra_id[len("misra-c2012-"):]
|
||||||
num = int(num[:num.index(".")]) * 100 + int(num[num.index(".")+1:])
|
num = int(num[:num.index(".")]) * 100 + int(num[num.index(".")+1:])
|
||||||
print("\t%15s (%s): %d" % (misra_id, checker.ruleTexts[num].severity, rules_violated[misra_id]))
|
severity = '-'
|
||||||
|
if num in checker.ruleTexts:
|
||||||
|
severity = checker.ruleTexts[num].severity
|
||||||
|
print("\t%15s (%s): %d" % (misra_id, severity, rules_violated[misra_id]))
|
||||||
|
|
||||||
if args.show_suppressed_rules:
|
if args.show_suppressed_rules:
|
||||||
checker.showSuppressedRules()
|
checker.showSuppressedRules()
|
||||||
|
|
|
@ -498,6 +498,9 @@ union misra_19_2 { }; // 19.2
|
||||||
#define int short // 20.4
|
#define int short // 20.4
|
||||||
#undef X // 20.5
|
#undef X // 20.5
|
||||||
|
|
||||||
|
#define M1(A) (A+1) // 20.7
|
||||||
|
#define M2(A,B) (1+AB+2)
|
||||||
|
|
||||||
#else1 // 20.13
|
#else1 // 20.13
|
||||||
|
|
||||||
#ifdef A>1
|
#ifdef A>1
|
||||||
|
|
Loading…
Reference in New Issue