Partager via


Avertissement C26459

Vous avez appelé une fonction STL « %function% » avec un paramètre de pointeur brut à la position « %position% », ce qui peut présenter un risque. Cela implique que l’appelant doit vérifier l’exactitude des valeurs transmises. Envisagez d’envelopper votre plage dans un gsl::span et de le transmettre en tant qu’itérateur d’étendue (stl.1).

Notes

Les écritures hors limites sont l’une des principales causes des vulnérabilités d’exécution de code à distance. Une solution serait d’utiliser des structures de données vérifiées telles que gsl::span. Cet avertissement identifie les cas où les algorithmes STL (Standard Template Library) fonctionnent sur des pointeurs bruts en tant que plages de sortie. Les pointeurs bruts n’ont pas de limite de vérification. Pour éviter les vulnérabilités, utilisez plutôt gsl::span.

Nom de l’analyse du code : NO_RAW_POINTER_IN_STL_RANGE_CHECKED

Exemple

Le code suivant illustre un comportement non défini, car il n’existe aucune limite de vérification et copy_if écrit au-delà du stockage fourni.

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
}

Pour résoudre ce problème, utilisez gsl::span pour vérifier que la plage de sortie dispose d’une limite de vérification :

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
}