CERT.MEMCMP.FLOAT_MEMBER
当使用 memcmp() 将两个包含浮点成员的结构进行比较时,CERT.MEMCMP.FLOAT_MEMBER 检查器会报告缺陷。
漏洞与风险
即使两个浮点的值相等,它们也可能不等效。因此,直接使用 memcmp() 可能会导致不正确的结果。
缓解与预防
不应直接使用 memcmp() 将包含浮点对象的结构进行比较。相反,应单独比较成员,以检查浮点成员是否等效。
漏洞代码示例
复制
struct S {
int a;
float f;
};
bool comparison(const struct S *S0, const struct S *S1) {
if (!S0 && !S1)
return true;
else if (!S0 || !S1)
return false;
return 0 == memcmp(S0, S1, sizeof(struct S));
}
在此示例中,我们使用 memcmp() 将包含浮点成员的结构进行比较。Klocwork 将在第 11 行报告 CERT.MEMCMP.FLOAT_MEMBER 缺陷。
修正代码示例
复制
struct S {
int a;
float f;
};
bool comparison(const struct S *S0, const struct S *S1) {
if (!S0 && !S1)
return true;
else if (!S0 || !S1)
return false;
return (S0->a == S1->a && S0->f == S1->f);
}
在此修正代码示例中,代码单独比较结构的成员,因此 Klocwork 未报告缺陷。