Misra: Added 12.2 rule
This commit is contained in:
parent
ed03545725
commit
44f9f1c065
|
@ -3,6 +3,8 @@
|
||||||
python misra.py misra-test.c.dump
|
python misra.py misra-test.c.dump
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
typedef unsigned char u8;
|
||||||
|
|
||||||
void misra_5_1() {
|
void misra_5_1() {
|
||||||
int a123456789012345678901234567890; // no-warning
|
int a123456789012345678901234567890; // no-warning
|
||||||
int a1234567890123456789012345678901; // 5.1
|
int a1234567890123456789012345678901; // 5.1
|
||||||
|
@ -23,6 +25,10 @@ void misra_12_1() {
|
||||||
a = b << c + d; // 12.1
|
a = b << c + d; // 12.1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void misra_12_2(u8 x) {
|
||||||
|
a = x << 8; // 12.2
|
||||||
|
}
|
||||||
|
|
||||||
void misra_12_3() {
|
void misra_12_3() {
|
||||||
f((1,2),3); // TODO
|
f((1,2),3); // TODO
|
||||||
for (i=0;i<10;i++,j++){} // 12.3
|
for (i=0;i<10;i++,j++){} // 12.3
|
||||||
|
|
|
@ -19,6 +19,26 @@ def reportError(token, num1, num2):
|
||||||
sys.stderr.write(
|
sys.stderr.write(
|
||||||
'[' + token.file + ':' + str(token.linenr) + '] misra ' + str(num1) + '.' + str(num2) + ' violation\n')
|
'[' + token.file + ':' + str(token.linenr) + '] misra ' + str(num1) + '.' + str(num2) + ' violation\n')
|
||||||
|
|
||||||
|
def getEssentialType(expr):
|
||||||
|
if not expr:
|
||||||
|
return None
|
||||||
|
if expr.variable:
|
||||||
|
typeToken = expr.variable.typeStartToken
|
||||||
|
while typeToken and typeToken.isName:
|
||||||
|
if typeToken.str in ['char', 'short', 'int', 'long', 'float', 'double']:
|
||||||
|
return typeToken.str
|
||||||
|
typeToken = typeToken.next
|
||||||
|
return None
|
||||||
|
|
||||||
|
def bitsOfEssentialType(expr):
|
||||||
|
type = getEssentialType(expr)
|
||||||
|
if type is None:
|
||||||
|
return 0
|
||||||
|
if type == 'char':
|
||||||
|
return 8
|
||||||
|
# TODO get --platform type sizes
|
||||||
|
return 0
|
||||||
|
|
||||||
def hasSideEffects(expr):
|
def hasSideEffects(expr):
|
||||||
if not expr:
|
if not expr:
|
||||||
return False
|
return False
|
||||||
|
@ -118,6 +138,24 @@ def misra_12_1(data):
|
||||||
reportError(token, 12, 1)
|
reportError(token, 12, 1)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
def misra_12_2(data):
|
||||||
|
for token in data.tokenlist:
|
||||||
|
if not (token.str in ['<<','>>']):
|
||||||
|
continue
|
||||||
|
if (not token.astOperand2) or (not token.astOperand2.values):
|
||||||
|
continue
|
||||||
|
maxval = 0
|
||||||
|
for val in token.astOperand2.values:
|
||||||
|
if val.intvalue > maxval:
|
||||||
|
maxval = val.intvalue
|
||||||
|
if maxval == 0:
|
||||||
|
continue
|
||||||
|
sz = bitsOfEssentialType(token.astOperand1)
|
||||||
|
if sz <= 0:
|
||||||
|
continue
|
||||||
|
if maxval >= sz:
|
||||||
|
reportError(token, 12, 2)
|
||||||
|
|
||||||
def misra_12_3(data):
|
def misra_12_3(data):
|
||||||
for token in data.tokenlist:
|
for token in data.tokenlist:
|
||||||
if token.str != ',':
|
if token.str != ',':
|
||||||
|
@ -164,6 +202,7 @@ for arg in sys.argv[1:]:
|
||||||
misra_7_3(data.rawTokens)
|
misra_7_3(data.rawTokens)
|
||||||
misra_12_1_sizeof(data.rawTokens)
|
misra_12_1_sizeof(data.rawTokens)
|
||||||
misra_12_1(cfg)
|
misra_12_1(cfg)
|
||||||
|
misra_12_2(cfg)
|
||||||
misra_12_3(cfg)
|
misra_12_3(cfg)
|
||||||
misra_13_5(cfg)
|
misra_13_5(cfg)
|
||||||
misra_14_4(cfg)
|
misra_14_4(cfg)
|
||||||
|
|
Loading…
Reference in New Issue