Misra: Refactoring

This commit is contained in:
Daniel Marjamäki 2017-04-15 14:29:29 +02:00
parent 6d0f75fbae
commit 2236034243
1 changed files with 30 additions and 28 deletions

View File

@ -25,6 +25,17 @@ def reportError(token, num1, num2):
else:
sys.stderr.write('[' + token.file + ':' + str(token.linenr) + '] misra ' + str(num1) + '.' + str(num2) + ' violation\n')
def reportErrorFileLine(file, linenr, num1, num2):
class Tok:
file = ''
linenr = ''
def __init__(self):
return
token = Tok
token.file = file
token.linenr = linenr
reportError(token, num1, num2)
def simpleMatch(token, pattern):
for p in pattern.split(' '):
if not token or token.str != p:
@ -222,17 +233,10 @@ def findGotoLabel(gotoToken):
tok = tok.next
return None
def findInclude(rawTokens, header):
linenr = -1
for token in rawTokens:
if token.str.startswith('//') or token.str.startswith('/*') or token.linenr == linenr:
continue
linenr = token.linenr
if not simpleMatch(token, '# include'):
continue
headerToken = token.next.next
if headerToken and headerToken.str == header:
return headerToken
def findInclude(directives, header):
for directive in directives:
if directive.str == '#include ' + header:
return directive
return None
def misra_5_1(data):
@ -659,15 +663,15 @@ def misra_21_3(data):
if (token.str in ['malloc', 'calloc', 'realloc', 'free']) and token.next and token.next.str == '(':
reportError(token, 21, 3)
def misra_21_4(rawTokens):
token = findInclude(rawTokens, '<setjmp.h>')
if token:
reportError(token, 21, 4)
def misra_21_4(data):
directive = findInclude(data.directives, '<setjmp.h>')
if directive:
reportErrorFileLine(directive.file, directive.linenr, 21, 4)
def misra_21_5(rawTokens):
token = findInclude(rawTokens, '<signal.h>')
if token:
reportError(token, 21, 5)
def misra_21_5(data):
directive = findInclude(data.directives, '<signal.h>')
if directive:
reportErrorFileLine(directive.file, directive.linenr, 21, 5)
def misra_21_7(data):
for token in data.tokenlist:
@ -684,10 +688,10 @@ def misra_21_9(data):
if (token.str in ['bsearch', 'qsort']) and token.next and token.next.str == '(':
reportError(token, 21, 9)
def misra_21_11(rawTokens):
token = findInclude(rawTokens, '<tgmath.h>')
if token:
reportError(token, 21, 11)
def misra_21_11(data):
directive = findInclude(data.directives, '<tgmath.h>')
if directive:
reportErrorFileLine(directive.file, directive.linenr, 21, 11)
if '-verify' in sys.argv[1:]:
VERIFY = True
@ -761,14 +765,12 @@ for arg in sys.argv[1:]:
misra_20_4(data.rawTokens)
misra_20_5(data.rawTokens)
misra_21_3(cfg)
if cfgNumber == 1:
misra_21_4(data.rawTokens)
misra_21_5(data.rawTokens)
misra_21_4(cfg)
misra_21_5(cfg)
misra_21_7(cfg)
misra_21_8(cfg)
misra_21_9(cfg)
if cfgNumber == 1:
misra_21_11(data.rawTokens)
misra_21_11(cfg)
if VERIFY:
for expected in VERIFY_EXPECTED: