Condividi tramite


Avviso C26459

È stata chiamata una funzione STL '%function%' con un parametro puntatore non elaborato nella posizione '%position%' che potrebbe non essere sicuro. Questo si basa sul chiamante per verificare che i valori passati siano corretti. Prendere in considerazione il wrapping dell'intervallo in gsl::span e passare come iteratore span (stl.1)

Osservazioni:

Le scritture non associate sono una delle cause principali delle vulnerabilità di esecuzione del codice remoto. Un rimedio consiste nell'usare strutture di dati controllate con limiti come gsl::span. Questo avviso identifica i casi in cui gli algoritmi STL (Standard Template Library) operano su puntatori non elaborati come intervalli di output. I puntatori non elaborati non sono controllati. Per evitare vulnerabilità, usare gsl::span invece .

Nome dell'analisi del codice: NO_RAW_POINTER_IN_STL_RANGE_CHECKED

Esempio

Il codice seguente illustra un comportamento non definito perché non sono presenti limiti di controllo e copy_if scritture oltre l'archiviazione fornita.

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
}

Per correggere l'avviso, usare gsl::span per assicurarsi che l'intervallo di output sia selezionato:

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
}