CWARN.SIGNEDBIT

有符号位域仅有一个位

CWARN.SIGNEDBIT 检查器可查找其中有符号位域仅有一个位的实例。

漏洞与风险

有符号位域需要至少两个位,该域的两个可能值为 -1 和 0。虽然可以针对 0 检查 1 位有符号位域,并将其用作布尔标记,但其他算术运算可能产生意外结果。

漏洞代码示例

复制
  struct BITS {
    int n:1;
  };
  
  void foo() {
    struct BITS b;
    b.n = 1;
    if (b.n > 0)    
    {
     ...
   }
 }

Klocwork 标记了第 2 行,该行中已定义 1 位有符号位域。