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 未报告缺陷。