misra; fix essential type for integer literals
This commit is contained in:
parent
bc43bfcb73
commit
937146127a
|
@ -455,6 +455,26 @@ def getEssentialCategorylist(operand1, operand2):
|
||||||
return e1, e2
|
return e1, e2
|
||||||
|
|
||||||
|
|
||||||
|
def get_essential_type_from_value(value, is_signed):
|
||||||
|
if value is None:
|
||||||
|
return None
|
||||||
|
for t in ('char', 'short', 'int', 'long', 'long long'):
|
||||||
|
bits = bitsOfEssentialType(t)
|
||||||
|
if bits >= 64:
|
||||||
|
continue
|
||||||
|
if is_signed:
|
||||||
|
range_min = -(1 << (bits - 1))
|
||||||
|
range_max = (1 << (bits - 1)) - 1
|
||||||
|
else:
|
||||||
|
range_min = 0
|
||||||
|
range_max = (1 << bits) - 1
|
||||||
|
sign = 'signed' if is_signed else 'unsigned'
|
||||||
|
if is_signed and value < 0 and value >= range_min:
|
||||||
|
return '%s %s' % (sign, t)
|
||||||
|
if value >= 0 and value <= range_max:
|
||||||
|
return '%s %s' % (sign, t)
|
||||||
|
return None
|
||||||
|
|
||||||
def getEssentialType(expr):
|
def getEssentialType(expr):
|
||||||
if not expr:
|
if not expr:
|
||||||
return None
|
return None
|
||||||
|
@ -474,7 +494,19 @@ def getEssentialType(expr):
|
||||||
if expr.valueType.isIntegral():
|
if expr.valueType.isIntegral():
|
||||||
return '%s %s' % (expr.valueType.sign, expr.valueType.type)
|
return '%s %s' % (expr.valueType.sign, expr.valueType.type)
|
||||||
|
|
||||||
if expr.str in ('<', '<=', '>=', '>', '==', '!=', '&&', '||', '!'):
|
elif expr.isNumber:
|
||||||
|
# Appendix D, D.6 The essential type of literal constants
|
||||||
|
# Integer constants
|
||||||
|
if expr.valueType.type == 'bool':
|
||||||
|
return 'Boolean'
|
||||||
|
if expr.valueType.isFloat():
|
||||||
|
return expr.valueType.type
|
||||||
|
if expr.valueType.isIntegral():
|
||||||
|
if expr.valueType.type != 'int':
|
||||||
|
return '%s %s' % (expr.valueType.sign, expr.valueType.type)
|
||||||
|
return get_essential_type_from_value(expr.getKnownIntValue(), expr.valueType.sign == 'signed')
|
||||||
|
|
||||||
|
elif expr.str in ('<', '<=', '>=', '>', '==', '!=', '&&', '||', '!'):
|
||||||
return 'Boolean'
|
return 'Boolean'
|
||||||
|
|
||||||
elif expr.astOperand1 and expr.astOperand2 and expr.str in (
|
elif expr.astOperand1 and expr.astOperand2 and expr.str in (
|
||||||
|
@ -491,6 +523,7 @@ def getEssentialType(expr):
|
||||||
return e2
|
return e2
|
||||||
else:
|
else:
|
||||||
return e1
|
return e1
|
||||||
|
|
||||||
elif expr.str == "~":
|
elif expr.str == "~":
|
||||||
e1 = getEssentialType(expr.astOperand1)
|
e1 = getEssentialType(expr.astOperand1)
|
||||||
return e1
|
return e1
|
||||||
|
|
|
@ -259,21 +259,21 @@ static void misra_7_2_call_test(int a, unsigned int b, unsigned int c) { } // 2.
|
||||||
static void misra_7_2_call_va_test(int a, ...) { } // 2.7
|
static void misra_7_2_call_va_test(int a, ...) { } // 2.7
|
||||||
|
|
||||||
static void misra_7_2(void) {
|
static void misra_7_2(void) {
|
||||||
unsigned int a = 2147483647;
|
uint32_t a = 2147483647;
|
||||||
const unsigned int b = 2147483648U;
|
const uint32_t b = 2147483648U;
|
||||||
const unsigned int c = 2147483648; // 7.2
|
const uint32_t c = 2147483648; // 7.2 10.3
|
||||||
unsigned int d = 2147483649; // 7.2
|
uint32_t d = 2147483649; // 7.2 10.3
|
||||||
|
|
||||||
unsigned char e = 0x80; // 7.2
|
uint8_t e = 0x80; // 7.2 10.3
|
||||||
unsigned char f = 0x80U;
|
uint8_t f = 0x80U;
|
||||||
unsigned short g = 0x8000; // 7.2
|
uint16_t g = 0x8000; // 7.2 10.3
|
||||||
unsigned short h = 0x8000U;
|
uint16_t h = 0x8000U;
|
||||||
unsigned int i = 0x80000000; // 7.2
|
uint32_t i = 0x80000000; // 7.2
|
||||||
unsigned int j = 0x80000000U;
|
uint32_t j = 0x80000000U;
|
||||||
unsigned long long k = 0x8000000000000000; // TODO 7.2
|
uint64_t k = 0x8000000000000000; // TODO 7.2
|
||||||
unsigned long long l = 0x8000000000000000ULL;
|
uint64_t l = 0x8000000000000000ULL;
|
||||||
|
|
||||||
unsigned int m = 1 + 0x80000000; // 7.2 10.4
|
uint32_t m = 1 + 0x80000000; // 7.2 10.4
|
||||||
|
|
||||||
misra_7_2_call_test(1, 2, 2147483648U);
|
misra_7_2_call_test(1, 2, 2147483648U);
|
||||||
misra_7_2_call_test(1, 2, 2147483648); // 7.2
|
misra_7_2_call_test(1, 2, 2147483648); // 7.2
|
||||||
|
@ -594,7 +594,7 @@ static void misra_10_1(uint32_t u, char c1, char c2) {
|
||||||
int32_t i;
|
int32_t i;
|
||||||
char c;
|
char c;
|
||||||
enum { E1 = 1 };
|
enum { E1 = 1 };
|
||||||
i = 3 << 1; // 10.1
|
i = 3 << 1; // 10.1 10.6
|
||||||
i = (u & u) << 4; // no-warning
|
i = (u & u) << 4; // no-warning
|
||||||
c = c1 & c2; // 10.1
|
c = c1 & c2; // 10.1
|
||||||
c = c1 << 1; // 10.1
|
c = c1 << 1; // 10.1
|
||||||
|
@ -869,9 +869,9 @@ static void misra_12_4(void) {
|
||||||
bool t;
|
bool t;
|
||||||
x = 123456u * 123456u; // TODO 12.4
|
x = 123456u * 123456u; // TODO 12.4
|
||||||
x = MISRA12_4a + MISRA12_4b; // TODO 12.4
|
x = MISRA12_4a + MISRA12_4b; // TODO 12.4
|
||||||
x = 0u - 1u; // TODO 12.4
|
//x = 0u - 1u; // TODO 12.4
|
||||||
x = t ? 0u : (0u-1u); // TODO 12.4
|
//x = t ? 0u : (0u-1u); // TODO 12.4
|
||||||
x = 556200230913ULL;
|
x = 556200230913ULL; // 10.3
|
||||||
foo(&volatile_macro_12_4); // no crash
|
foo(&volatile_macro_12_4); // no crash
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue