警告 C26459
安全でない可能性のある位置 '%position%' に生ポインター パラメータを指定して STL 関数 '%function%' を呼び出しました。これは、渡された値が正しいかの確認を呼び出し側に依存しています。 範囲を gsl::span で折り返して、span 反復子として渡すことを検討してください (stl.1)
解説
範囲外の書き込みは、リモート コード実行の脆弱性の主な原因の 1 つです。 1つの解決策は、gsl::span
のような境界チェックされたデータ構造を使用することです。 この警告は、標準テンプレート ライブラリ (STL) アルゴリズムが生ポインターに対して出力範囲として動作するケースを識別します。 生ポインターは境界チェックされません。 脆弱性を防ぐには、代わりに gsl::span
を使用します。
コード分析名: NO_RAW_POINTER_IN_STL_RANGE_CHECKED
例
次のコードは、境界チェックがなく、copy_if
が提供されたストレージを超えて書き込むため、未定義の動作を示しています。
void f()
{
std::vector<int> myints = { 10, 20, 30, 40, 50, 60, 70 };
int mydestinationArr[7] = { 10, 20, 80 };
std::copy_if(myints.begin(), myints.end(), mydestinationArr, [](int i) { return !(i<0); }); // Warning: C26459
}
警告を修正するには、gsl::span
を使用して、出力範囲が境界チェックされていることを確認します。
void f()
{
std::vector<int> myints = { 10, 20, 30, 40, 50, 60, 70 };
int mydestinationArr[7] = { 10, 20, 80 };
gsl::span<int> mySpan{mydestinationArr};
std::copy_if(myints.begin(), myints.end(), mySpan.begin(), [](int i) { return !(i<0); }); // No warning
}