警告 C26459
您呼叫了 STL 函式 '%function%',它在可能不安全的位置 '%position%' 有原始指標參數,檢查傳遞的值正確無誤是呼叫者的責任。 建議在 gsl::span 中將範圍換行,以 span 迭代器 (stl.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
}