Поделиться через


Предупреждение 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
}