位运算符不应作用于有符号整数
10.3.3 ID_bitwiseOperOnSigned
符号位在位运算方面没有逻辑意义,对负数进行位运算往往意味着逻辑错误。
示例:
int foo(signed s, unsigned u) {
return s & u; // Non-compliant
}
int bar(signed s, unsigned u) {
if (s < 0) {
int a = s << u; // Non-compliant, undefined in C and C++11
int b = s >> u; // Non-compliant, implementation-defined
return a + b;
}
return 0;
}
例中 s 为有符号整数,其符号位对位运算没有意义,对负数左移会导致标准未定义的行为,对负数右移则由实现定义。
相关
依据
ISO/IEC 9899:1999 6.5.7(3)-undefined
ISO/IEC 9899:2011 6.5.7(3)-undefined
ISO/IEC 14882:2003 5.8(2)
ISO/IEC 14882:2003 5.8(3)-implementation
ISO/IEC 14882:2011 5.8(2)-undefined
ISO/IEC 14882:2011 5.8(3)-implementation
参考
CWE-682
C++ Core Guidelines ES.101
MISRA C 2004 12.7
MISRA C 2012 10.1
MISRA C++ 2008 5-0-21
SEI CERT INT13-C