BSTR.CAST.CPP

間違った C++ スタイルの型が BSTR にキャストされました

BSTR.CAST.C チェッカーは、BSTR 式に明示的にキャストされた C++ スタイルの式を検出します。

脆弱性とリスク

2 つのスタイルの構造が異なるため、COM スタイルの BSTR 文字列と、C スタイルの文字列との間の変換には注意が必要です。場合によっては、2 つの間の変換はうまくコンパイルされるものの、予期しない結果を引き起こすことがあります。

BSTR 仕様を満たさないポインターの BSTR 型へのキャストはメモリ使用に関連する問題を発生させる可能性があります。

軽減と防止

C スタイルの文字列と異なり、BSTR 文字列には、続くデータ文字列にバイト数を含む、4 バイトの長さの接頭辞が含まれます。BSTR 文字列は、組み込み null 文字を含むこともでき、強く型指定されません。このため、新しい設計では BSTR を使用しないことが最適です。既存のインターフェイスについては、変換を行い、Sys*Alloc*、SysFree*、および Sys*String* の各メモリ割り当て関数を慎重に使用することが重要です。

脆弱コード例

コピー
  void bstr_cast_cpp() {
    wchar_t *foo = L"abc";
    BSTR bar = reinterpret_cast<BSTR>(foo);
  }

Klocwork は、非 BSTR 変数 foo が BSTR ポインターにキャストされている 3 行目にフラグを立てます。

修正コード例

コピー
  void bstr_cast_cpp() {
    BSTR foo = SysAllocString(L"abc");
    BSTR bar = reinterpret_cast<BSTR>(foo);
  }

この修正例では、変数 foo を BSTR にする予定であったと仮定しているため、正しい SysAllocString 変換関数を使用して BSTR として定義されます。

関連チェッカー