CERT.MEMCMP.FLOAT_MEMBER

CERT.MEMCMP.FLOAT_MEMBER チェッカーは、浮動小数点メンバーを含む 2 つの構造体が memcmp() を使用して比較されるときに、欠陥を報告します。

脆弱性とリスク

2 つの浮動小数点の値が等しい場合でも、それらは等価でない可能性があります。そのため 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 は欠陥を報告しません。