STRONG.TYPE.JOIN.ZERO
比较强类型与零
STRONG.TYPE 系列检查器会检测违反或忽略程序员强制实施的强类型指定(类型定义的抽象类型),从而导致基础 ANSI 类型语义占据主导地位的情况。
STRONG.TYPE.JOIN.ZERO 检查器查找那些使用二进制运算符来比较强类型的值和零值的实例。
在此规则中,零值被定义为任何没有转换为强类型的零常数。例如,检查器将以下内容视为零值:
- 0L
- (int)0
检查器不会将以下示例视为零值:
- (SPEED)0
- (SPEED*)0
漏洞与风险
遵循 ANSI 标准的编译器不会针对此类问题生成警告,因为此编译器仅检查基础类型,不会检查表面类型(即程序员定义的类型)。所以可能会出现逻辑错误。
漏洞代码示例
复制
typedef float Speed;
int main() {
Speed s;
if (s == 0) ;
return 0;
}
Klocwork 标记了第 5 行,指出将强类型值 s 与零值进行比较。
修正代码示例
复制
typedef float Speed;
int main() {
Speed s;
if (s == (Speed) 0) ;
return 0;
}
在经修正的代码中,明确地将两个强类型值进行比较。