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
}