Misra: Add rule 9.5

This commit is contained in:
Daniel Marjamäki 2017-04-16 17:19:30 +02:00
parent b5bd9468de
commit b2a846dff0
2 changed files with 22 additions and 7 deletions

View File

@ -28,6 +28,10 @@ void misra_7_3() {
void misra_8_14(char * restrict str) {} // 8.14 void misra_8_14(char * restrict str) {} // 8.14
void misra_9_5() {
int x[] = {[0]=23}; // 9.5
}
void misra_10_4(u8 x, u16 y) { void misra_10_4(u8 x, u16 y) {
z = x + y; // 10.4 z = x + y; // 10.4
} }

View File

@ -168,6 +168,10 @@ def hasFloatComparison(expr):
def hasSideEffectsRecursive(expr): def hasSideEffectsRecursive(expr):
if not expr: if not expr:
return False return False
if expr.str == '=' and expr.astOperand1 and expr.astOperand1.str == '[':
prev = expr.astOperand1.previous
if prev and (prev.str == '{' or prev.str == '{'):
return hasSideEffectsRecursive(expr.astOperand2)
if expr.str in ['++', '--', '=']: if expr.str in ['++', '--', '=']:
return True return True
# Todo: Check function calls # Todo: Check function calls
@ -276,6 +280,11 @@ def misra_8_14(rawTokens):
if token.str == 'restrict': if token.str == 'restrict':
reportError(token, 8, 14) reportError(token, 8, 14)
def misra_9_5(rawTokens):
for token in rawTokens:
if simpleMatch(token, '[ ] = { ['):
reportError(token, 9, 5)
def misra_10_4(data): def misra_10_4(data):
for token in data.tokenlist: for token in data.tokenlist:
if not token.str in ['+','-','*','/','%','&','|','^'] and not token.isComparisonOp: if not token.str in ['+','-','*','/','%','&','|','^'] and not token.isComparisonOp:
@ -500,14 +509,13 @@ def misra_13_1(data):
def misra_13_3(data): def misra_13_3(data):
for token in data.tokenlist: for token in data.tokenlist:
if not token.astOperand1: if not token.str in ['++', '--']:
continue continue
if token.astParent and token.astParent.str != ',': astTop = token
continue while astTop.astParent and not astTop.astParent.str in [',', ';']:
if token.str == ',': astTop = astTop.astParent
continue if countSideEffects(astTop) >= 2:
if countSideEffects(token) >= 2: reportError(astTop, 13, 3)
reportError(token, 13, 3)
def misra_13_4(data): def misra_13_4(data):
for token in data.tokenlist: for token in data.tokenlist:
@ -515,6 +523,8 @@ def misra_13_4(data):
continue continue
if not token.astParent: if not token.astParent:
continue continue
if token.astOperand1.str == '[' and (token.astOperand1.previous.str=='{' or token.astOperand1.previous.str==','):
continue
if not (token.astParent.str in [',', ';']): if not (token.astParent.str in [',', ';']):
reportError(token, 13, 4) reportError(token, 13, 4)
@ -873,6 +883,7 @@ for arg in sys.argv[1:]:
misra_7_1(data.rawTokens) misra_7_1(data.rawTokens)
misra_7_3(data.rawTokens) misra_7_3(data.rawTokens)
misra_8_14(data.rawTokens) misra_8_14(data.rawTokens)
misra_9_5(data.rawTokens)
misra_10_4(cfg) misra_10_4(cfg)
misra_10_6(cfg) misra_10_6(cfg)
misra_10_8(cfg) misra_10_8(cfg)