Udostępnij przez


Ostrzeżenie C26816

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();
}

Zobacz też

C26815
ES.65: Nie wyłuszaj nieprawidłowego wskaźnika