Compartir vía


Advertencia C26459

Se llamó a una función STL "%function%" con un parámetro de puntero básico en la posición "%position%" que puede no ser segura. Se basa en que el autor de la llamada compruebe que los valores que se han pasado son correctos. Considere la posibilidad de ajustar el intervalo en gsl::span y pasarlo como iterador de intervalo (stl.1)

Comentarios

Las escrituras no enlazadas son una de las principales causas de vulnerabilidades de ejecución remota de código. Un remedio consiste en usar estructuras de datos comprobadas enlazadas como gsl::span. Esta advertencia identifica los casos en los que los algoritmos de la Biblioteca de plantillas estándar (STL) funcionan en punteros sin procesar como intervalos de salida. Los punteros sin procesar no están protegidos. Para evitar vulnerabilidades, use gsl::span en su lugar.

Nombre de análisis de código: NO_RAW_POINTER_IN_STL_RANGE_CHECKED

Ejemplo

En el siguiente código se muestra un comportamiento indefinido porque no hay ninguna comprobación de límites y copy_if escribe más allá del almacenamiento proporcionado.

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
}

Para corregir la advertencia, use gsl::span para asegurarse de que el intervalo de salida está protegido:

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
}