CodeQL 文档

按位运算符号检查

ID: cpp/bitwise-sign-check
Kind: problem
Security severity: 
Severity: warning
Precision: high
Tags:
   - reliability
   - correctness
Query suites:
   - cpp-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

此规则查找检查按位运算结果符号的代码。这种检查可能会产生意外的结果。例如,考虑以下检查变量 x 的第 n 位是否设置的代码

  x & (1 << n) > 0 

如果 x 是一个 32 位有符号整数,则 x & (1 << 31) 的值将被解释为一个有符号数。如果 x 为负数(即其符号位被设置),并且 n 为 31,则 x & (1 << 31) 计算结果为 0x80000000(除符号位外,所有位均为零)。对此值的符号检查失败,这意味着 x 的第 31 位未设置。这显然是错误的。

建议

上述符号检查应改写为

  x & (1 << n) != 0

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私