MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / misra_12_4_check_expr

Method misra_12_4_check_expr

addons/misra.py:2940–2968  ·  view source on GitHub ↗
(self, expr)

Source from the content-addressed store, hash-verified

2938 prev = prev.previous
2939
2940 def misra_12_4_check_expr(self, expr):
2941 if not expr.astOperand2 or not expr.astOperand1:
2942 return
2943 if expr.valueType is None:
2944 return
2945 if expr.valueType.sign is None or expr.valueType.sign != 'unsigned':
2946 return
2947 if expr.valueType.pointer > 0:
2948 return
2949 if not expr.valueType.isIntegral():
2950 return
2951 op1 = expr.astOperand1.getKnownIntValue()
2952 if op1 is None:
2953 return
2954 op2 = expr.astOperand2.getKnownIntValue()
2955 if op2 is None:
2956 return
2957 bits = bitsOfEssentialType('unsigned ' + expr.valueType.type)
2958 if bits <= 0 or bits >= 64:
2959 return
2960 max_value = (1 << bits) - 1
2961 if not is_constant_integer_expression(expr):
2962 return
2963 if expr.str == '+' and op1 + op2 > max_value:
2964 self.reportError(expr, 12, 4)
2965 elif expr.str == '-' and op1 - op2 < 0:
2966 self.reportError(expr, 12, 4)
2967 elif expr.str == '*' and op1 * op2 > max_value:
2968 self.reportError(expr, 12, 4)
2969 def misra_12_4(self, cfg):
2970 if not cfg.tokenlist:
2971 return

Callers 1

misra_12_4Method · 0.95

Calls 5

reportErrorMethod · 0.95
bitsOfEssentialTypeFunction · 0.85
isIntegralMethod · 0.80
getKnownIntValueMethod · 0.80

Tested by

no test coverage detected