Предупреждение C26459
Вы назвали функцию STL "%function%" с необработанным параметром указателя в позиции "%position%", которая может быть небезопасной. Это зависит от вызывающего объекта, чтобы проверить правильность переданных значений. Рекомендуется упаковать диапазон в gsl::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
}