BSTR.OPS.EQS
BSTR 値を使用した不正確な等価比較
BSTR.OPS.COMP チェッカーは、BSTR エンティティとの等価比較のインスタンスを検出します。等価比較演算は、BSTR コンテキストでは意味がなく、等価比較演算を修正しなければ、不正なメモリ使用の原因となるため、BSTR 値に使用することはできません。
脆弱性とリスク
2 つのスタイルの構造が異なるため、COM スタイルの BSTR 文字列と、C スタイルの文字列との間の変換には注意が必要です。場合によっては、2 つの間の変換はうまくコンパイルされるものの、予期しない結果を引き起こすことがあります。
軽減と防止
C スタイルの文字列と異なり、BSTR 文字列には、続くデータ文字列にバイト数を含む、4 バイトの長さの接頭辞が含まれます。BSTR 文字列は、組み込み null 文字を含むこともでき、強く型指定されません。このため、新しい設計では BSTR を使用しないことが最適です。
脆弱コード例
コピー
void bstr_eqs() {
BSTR foo;
wchar_t *bar = L"abc";
if (foo != bar)
bar = NULL;
}
Klocwork は、等価比較演算が BSTR 値で試行された 4 行目にフラグを立てます。