CWARN.BITOP.SIZE

位运算符中不同大小的操作数

CWARN.BITOP.SIZE 检查器可查找代码,在这种代码中,位运算符(&=、|= 和 ^=)的操作数具有不同大小。虽然检查器不会标记 32 位值中使用的 64 位掩码,但是位运算符的两个操作数通常都必须为 32 位或 64 位值。

漏洞与风险

当无符号的 32 位值转换为 64 位类型时,更高的 32 位将设置为 0,这可能不是最初的设计意图并可能导致意外结果。

漏洞代码示例

复制
  typedef unsigned int u32;
  typedef unsigned long long u64;

  u32 get_u32_value(void);
  u64 get_u64_value(void);

  void example(void) {
    u32 mask32 = 0xff;
    u64 mask64 = 0xff;

    u32 value32 = get_u32_value();
    u64 value64 = get_u64_value();

  ...

   value64 &= ~mask32;
  }

在此代码中,Klocwork 标记了第 10 行,其中的一个 32 位掩码与 64 位数据一起使用。