Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Wskaźnik wskazuje pamięć przydzieloną na stos (ES.65)
Uwagi
Wskaźnik wskazuje zmienną przydzieloną na stos. Gdy zmienna wykracza poza zakres, zostanie wyczyszczona, co powoduje, że wskaźnik jest nieprawidłowy.
To sprawdzenie rozpoznaje widoki i właścicieli z standardowej biblioteki szablonów języka C++ (STL). Aby nauczyć się tego sprawdzania typów utworzonych przez użytkownika, użyj adnotacji [[msvc::lifetimebound]] .
Obsługa [[msvc::lifetimebound]] jest nowa w programie MSVC 17.7.
Nazwa analizy kodu: LIFETIME_LOCAL_USE_AFTER_FREE_STACK
Przykłady
// In this example, std::string is being used internally because the implementer felt it was easier to
// perform the non-trivial initialization of the value but the function returns a C-style string.
const char *danglingRawPtrFromLocal() {
std::string s;
// interesting string initialization here
return s.c_str(); // Oops, The pointer points to memory that will be cleaned up upon return. Warning C26816.
}
struct Y { int& get() [[msvc::lifetimebound]]; };
int& f() {
Y y;
return y.get(); // Warning C26826
}
Poprawka polega na wydłużeniu okresu eksploatacji używanej wartości. W tym przykładzie adresujemy ostrzeżenie, zwracając ciąg std::string. Można go również rozwiązać przez skopiowanie danych do sterta lub dodanie zmiennej "out" do listy parametrów funkcji.
std::string danglingRawPtrFromLocal() {
std::string s;
// interesting string initialization here
return s;
}
struct Y { int& get() [[msvc::lifetimebound]]; };
int f() {
Y y;
return y.get();
}