Updated rule 10 4 (#1251)

* Updated rule 10.4

* Updated rule 10.4

* updated rule 10.4 along with test suite
This commit is contained in:
Swasti Shrivastava 2018-05-21 15:34:20 +05:30 committed by Daniel Marjamäki
parent 0a0ffcdac6
commit f78314b613
2 changed files with 66 additions and 6 deletions

View File

@ -103,6 +103,40 @@ KEYWORDS = {
}
def getEssentialTypeCategory(expr):
if not expr:
return None
if expr.valueType.typeScope:
return "enum<" + expr.valueType.typeScope.className + ">"
if expr.variable:
typeToken = expr.variable.typeStartToken
while typeToken:
if typeToken.valueType:
if typeToken.valueType.type in {'bool'}:
return typeToken.valueType.type
if typeToken.valueType.type in {'float', 'double', 'long double'}:
return "float"
if typeToken.valueType.sign:
return typeToken.valueType.sign
typeToken = typeToken.next
if expr.valueType:
return expr.valueType.sign
def getEssentialCategorylist(operand1, operand2):
if not operand1 or not operand2:
return None, None
if (operand1.str in {'++', '--'} or
operand2.str in {'++', '--'}):
return None, None
if (operand1.valueType.pointer or
operand2.valueType.pointer):
return None, None
e1 = getEssentialTypeCategory(operand1)
e2 = getEssentialTypeCategory(operand2)
return e1, e2
def getEssentialType(expr):
if not expr:
return None
@ -646,17 +680,35 @@ def misra_9_5(rawTokens):
def misra_10_4(data):
op = {'+', '-', '*', '/', '%', '&', '|', '^', '+=', '-=', '?', ':'}
for token in data.tokenlist:
if token.str not in {'+', '-', '*', '/', '%', '&', '|', '^'} and not token.isComparisonOp:
if token.str not in op and not token.isComparisonOp:
continue
if not token.astOperand1 or not token.astOperand2:
continue
if not token.astOperand1.valueType or not token.astOperand2.valueType:
continue
if not token.astOperand1.valueType.isIntegral() or not token.astOperand2.valueType.isIntegral():
if ((token.astOperand1.str in op or token.astOperand1.isComparisonOp) and
(token.astOperand2.str in op or token.astOperand1.isComparisonOp)):
e1, e2 = getEssentialCategorylist(token.astOperand1.astOperand2, token.astOperand2.astOperand1)
elif token.astOperand1.str in op or token.astOperand1.isComparisonOp:
e1, e2 = getEssentialCategorylist(token.astOperand1.astOperand2, token.astOperand2)
elif token.astOperand2.str in op or token.astOperand2.isComparisonOp:
e1, e2 = getEssentialCategorylist(token.astOperand1, token.astOperand2.astOperand1)
else:
e1, e2 = getEssentialCategorylist(token.astOperand1, token.astOperand2)
if token.str == "+=" or token.str == "+":
if e1 == "char" and (e2 == "signed" or e2 == "unsigned"):
continue
if e2 == "char" and (e1 == "signed" or e1 == "unsigned"):
continue
if token.str == "-=" or token.str == "-":
if e1 == "char" and (e2 == "signed" or e2 == "unsigned"):
continue
if e1 and e2 and (e1.find('Anonymous') != -1 and (e2 == "signed" or e2 == "unsigned")):
continue
if e1 and e2 and (e2.find('Anonymous') != -1 and (e1 == "signed" or e1 == "unsigned")):
continue
e1 = getEssentialType(token.astOperand1)
e2 = getEssentialType(token.astOperand2)
if e1 and e2 and e1 != e2:
reportError(token, 10, 4)

View File

@ -14,6 +14,7 @@
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef signed int s32;
typedef unsigned long long u64;
//// 3.1
@ -145,8 +146,15 @@ void misra_9_5() {
int x[] = {[0]=23}; // 9.5
}
void misra_10_4(u8 x, u16 y) {
z = x + y; // 10.4
void misra_10_4(u32 x, s32 y) {
z = x + 3; // 10.4
enum misra_10_4_enuma { misra_10_4_A1, misra_10_4_A2, misra_10_4_A3 };
enum misra_10_4_enumb { misra_10_4_B1, misra_10_4_B2, misra_10_4_B3 };
if ( misra_10_4_B1 > misra_10_4_A1 ) //10.4
{
;
}
z = x + y //10.4
}
void misra_10_6(u8 x) {