BSTR.FUNC.ALLOC

BSTR 割り当て関数の不適切な呼び出しです

BSTR.FUNC.ALLOC チェッカーは、BSTR 型の値が関数の引数として指定されたときに、BSTR 割り当て関数 SysAllocString および SysAllocStringLen への呼び出しを検出します。

脆弱性とリスク

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

軽減と防止

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

脆弱コード例

コピー
  void bstr_alloc() {
    BSTR foo = SysAllocString(L"abc"), bar;
    bar = SysAllocString(foo);  
  }

Klocwork は、この例の 3 行目にフラグを立てます。SysAllocString は、その引数を通常の null 終了 C 文字列として処理するため、BSTR 文字列の組み込み null 文字はこの関数に関する問題の原因となる可能性があります。BSTR 変数を持つ SysAllocString から得られた短い文字列によって、予期しない結果が生じる可能性があります。

修正コード例

コピー
  void bstr_alloc() {
    BSTR foo = SysAllocString(L"abc"), bar;
    bar = foo; 
    SysFreeString(bar)   
  }

修正例では、SysAllocString が 3 行目から削除されています。また、正しい SysFreeString 関数を使用してメモリを解放しています。