BSTR.FUNC.REALLOC

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

BSTR.FUNC.REALLOC チェッカーは、BSTR 再割り当て関数 SysReAllocString または SysReAllocStringLen の不適切な呼び出しを検出します。関数の最初の引数は、BSTR エンティティを指すポインターであり、2 番目の引数はワイド文字列でなければなりません。Klocwork は、関数の最初の引数が間違っているか、または、BSTR 型の値が関数の 2 番目の引数として指定された場合に、コードにフラグを立てます。

脆弱性とリスク

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

軽減と防止

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

脆弱コード例

コピー
  void bstr_realloc(wchar_t *ws, BSTR bstr1, BSTR bstr2) {
    SysReAllocString(&ws, L"abc"); 
    SysReAllocString(&bstr1, bstr2);  
  }

Klocwork は、この例の 2 行目と 3 行目にフラグを立てます。Klocwork は、2 番目の引数に間違った型の値が指定されると、ほとんどの場合、コンパイラがエラーをキャッチするため、ステートメントにフラグを立てませんが、この場合の 2 行目では、最初の引数として BSTR 型の値が指定された場合、コンパイラを通して渡すことができるため、予期しない結果が発生します。3 行目では、2 番目の引数は BSTR 型であるため、長さの接頭辞は、文字列の値の一部と見なされ、意図しないプログラム動作が起こる可能性があります。