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 位数据一起使用。