BSTR.IA.INIT
BSTR 変数は非 BSTR 値で初期化されます
BSTR.IA.INIT チェッカーは、BSTR 変数が非 BSTR 値で初期化されているコードを検出します。BSTR 変数は、NULL 定数または BSTR 型の値でのみ初期化することができます。
脆弱性とリスク
2 つのスタイルの構造が異なるため、COM スタイルの BSTR 文字列と、C スタイルの文字列との間の変換には注意が必要です。場合によっては、2 つの間の変換はうまくコンパイルされるものの、予期しない結果を引き起こすことがあります。
軽減と防止
C スタイルの文字列と異なり、BSTR 文字列には、続くデータ文字列にバイト数を含む、4 バイトの長さの接頭辞が含まれます。BSTR 文字列は、組み込み null 文字を含むこともでき、強く型指定されません。このため、新しい設計では BSTR を使用しないことが最適です。既存のインターフェイスについては、変換を行い、Sys*Alloc*、SysFree*、および Sys*String* の各メモリ割り当て関数を慎重に使用することが重要です。
この規則を満たさないワイド文字列 (ワイド文字列定数など) で BSTR 文字列が初期化されると、メモリ使用に関連する問題が発生する可能性があります。
脆弱コード例
コピー
void bstr_init() {
BSTR foo = L"abc";
}
Klocwork は、BSTR 変数が非 BSTR 値で初期化されている 2 行目にフラグを立てます。
修正コード例
コピー
void bstr_init() {
BSTR foo = SysAllocString(L"abc");
}
この修正例では、変数 foo を BSTR にする予定であったと仮定しているため、正しい SysAllocString 変換関数を使用して BSTR として定義されます。