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 は欠陥を報告しません。