BSTR.FUNC.LEN

BSTR 関数を使用して非 BSTR 文字列の長さの取得を試行

BSTR.FUNCL.LEN チェッカーは、非 BSTR 文字列の長さの取得の試行に使用された SysStringLen 関数または SysStringByteLen 関数を検出します。これらの関数の唯一の引数は BSTR 型でなければなりません。

脆弱性とリスク

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

軽減と防止

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

長さの接頭辞が最初のワイド文字列に含まれない場合、予期しない結果が起こる可能性があります。

脆弱コード例

コピー
  void bstr_len(wchar_t *a) {
    int l = SysStringLen(a);
  }

Klocwork は、SysStringLen 関数が誤って使用されている 2 行目にフラグを立てます。SysStringLen は、変数に BSTR 長さの接頭辞を期待していますが、非 BSTR 変数でこれを使用すると、予期しない結果が起こる可能性があります。