(self, expr)
| 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 |
no test coverage detected