按位运算符号检查¶
ID: cpp/bitwise-sign-check
Kind: problem
Security severity:
Severity: warning
Precision: high
Tags:
- reliability
- correctness
Query suites:
- cpp-security-and-quality.qls
此规则查找检查按位运算结果符号的代码。这种检查可能会产生意外的结果。例如,考虑以下检查变量 x
的第 n
位是否设置的代码
x & (1 << n) > 0
如果 x
是一个 32 位有符号整数,则 x & (1 << 31)
的值将被解释为一个有符号数。如果 x
为负数(即其符号位被设置),并且 n
为 31,则 x & (1 << 31)
计算结果为 0x80000000
(除符号位外,所有位均为零)。对此值的符号检查失败,这意味着 x
的第 31 位未设置。这显然是错误的。
建议¶
上述符号检查应改写为
x & (1 << n) != 0