负号不应作用于无符号整数
10.3.2 ID_minusOnUnsigned
负号作用于 unsigned int、unsigned long、unsigned long long 等无符号整型表达式的结果仍为无符号整数,易产生意料之外的错误。
当 int 类型的取值范围可以包含 unsigned char、unsigned short 等“较小”无符号整型的取值范围时,较小的无符号整型可以被提升为 int 类型,负号作用于这种类型的表达式可以得到有符号的结果,但会降低可移植性。
示例:
unsigned int x = 1;
signed long long y = -x; // Non-compliant, ‘y’ equals UINT_MAX, not -1
unsigned long long z = -1ULL; // Non-compliant, use ULLONG_MAX instead
例中 y 的值预期为 -1,但实际值是无符号整数的最大值;-1ULL 这种常量是令人困惑的,应使用 ULLONG_MAX 代替。
配置
allowSmallUnsignedTypes: 是否允许负号作用于 unsigned char、unsigned short 等无符号整型表达式
依据
ISO/IEC 9899:1999 6.5.3.3(3)
ISO/IEC 9899:2011 6.5.3.3(3)
参考
MISRA C 2004 12.9
MISRA C 2012 10.1
MISRA C++ 2008 5-3-2