CERT.STR_ACCESS.INVALID
basic_string の要素にアクセスする際に、無効な参照、ポインター、反復子を使用しないでください。
CERT.STR_ACCESS.INVALID チェッカーは、何らかの操作によって basic_string との関連付けが無効化された後、参照、ポインター、反復子が使用されていることを検出します。このチェッカーは、プロシージャ内およびプロシージャ間のケースに対応しています。
このチェッカーは、モダンエンジンにのみ適用されます。
脆弱性とリスク
basic_string を変更する操作により、その要素を参照する参照、ポインター、反復子が無効化される可能性があります。無効化されたアクセスパスを使用すると、未定義の挙動が生じます。
このチェッカーは、reserve() や shrink_to_fit() の呼び出しを報告しません。これらの関数は常に再割り当てを引き起こすとは限らないためです。
軽減と防止
変更操作の後に反復子を更新するか、操作が完了してから新しいポインターまたは参照を取得します。文字列が変更された後に、文字列またはその要素を参照するアクセスパスを使用することは避けてください。
脆弱コード例
コピー
#include <string>
void update(std::string& value)
{
const char* data = value.data();
value.replace(0, 2, "bb");
use(data);
}
この例では、replace() によって文字列が変更された後、ポインターが無効になる可能性があります。これを use() に渡すと、未定義の挙動が生じる可能性があります。
修正コード例
コピー
#include <string>
void update(std::string& value)
{
value.replace(0, 2, "bb");
use(value.data());
}
修正例では、文字列の変更後にポインターが取得されます。