警告 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
}