移位数量不应超过相关类型比特位的数量
10.2.10 ID_illShiftCount
如果移位数量为负数、大于或等于相关类型比特位的数量,会导致标准未定义的行为。
示例:
uint32_t foo(uint16_t a) {
return a << 16; // Non-compliant, unportable
}
uint64_t bar(uint32_t b) {
return b << 32; // Non-compliant, undefined behavior
}
例中变量 a 为 16 位整数,是否会被提升为 32 位整型由实现定义,参见“类型提升”;变量 b 为 32 位整数,将其左移 32 位并不能得到 64 位整数,反而会导致标准未定义的行为。
应改为:
uint32_t foo(uint16_t a) {
return uint32_t(a) << 16; // Compliant
}
uint64_t bar(uint32_t b) {
return uint64_t(b) << 32; // Compliant
}
依据
ISO/IEC 9899:1999 6.5.7(3)-undefined
ISO/IEC 9899:2011 6.5.7(3)-undefined
ISO/IEC 14882:2003 5.8(1)-undefined
ISO/IEC 14882:2011 5.8(1)-undefined
ISO/IEC 14882:2017 8.8(1)-undefined
参考
MISRA C 2012 12.2
MISRA C++ 2008 5-8-1