Udostępnij za pośrednictwem


Ostrzeżenie C26459

Wywołano funkcję STL "%function%" z nieprzetworzonym parametrem wskaźnika w pozycji %position%, która może być niebezpieczna — opiera się to na obiekcie wywołującym, aby sprawdzić, czy przekazane wartości są poprawne. Rozważ zawijanie zakresu w gsl::span i przekaż jako iterator zakresu (stl.1)

Uwagi

Poza powiązanymi zapisami są jedną z głównych przyczyn luk w zabezpieczeniach zdalnego wykonywania kodu. Jednym z środków zaradczych jest użycie struktur danych sprawdzanych przez ograniczenia, takich jak gsl::span. To ostrzeżenie identyfikuje przypadki, w których algorytmy standardowej biblioteki szablonów (STL) działają na nieprzetworzonych wskaźnikach jako zakresach danych wyjściowych. Nieprzetworzone wskaźniki nie są sprawdzane. Aby zapobiec lukom w zabezpieczeniach, należy zamiast tego użyć polecenia gsl::span .

Nazwa analizy kodu: NO_RAW_POINTER_IN_STL_RANGE_CHECKED

Przykład

Poniższy kod demonstruje niezdefiniowane zachowanie, ponieważ nie ma żadnych ograniczeń sprawdzania i copy_if zapisu poza podanym magazynem.

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
}

Aby rozwiązać problem z ostrzeżeniem, użyj gsl::span polecenia , aby upewnić się, że zakres danych wyjściowych został sprawdzony:

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
}