Condividi tramite


Avviso C26816

Il puntatore punta alla memoria allocata nello stack (ES.65)

Osservazioni:

Il puntatore punta a una variabile allocata nello stack. Quando la variabile esce dall'ambito, viene eseguita la pulizia, causando l'invalidità del puntatore.

Questo controllo riconosce le visualizzazioni e i proprietari della libreria di modelli standard (STL) C++. Per insegnare a questo controllo sui tipi creati dall'utente, usare l'annotazione [[msvc::lifetimebound]] . Il [[msvc::lifetimebound]] supporto è una novità di MSVC 17.7.

Nome dell'analisi del codice: LIFETIME_LOCAL_USE_AFTER_FREE_STACK

Esempi

// 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
}

La correzione consiste nell'estendere la durata del valore utilizzato. In questo esempio viene risolto l'avviso restituendo std::string. Può anche essere risolto copiando i dati nell'heap o aggiungendo una variabile "out" all'elenco dei parametri della funzione.

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

Vedi anche

C26815
ES.65: Non dereferenziare un puntatore non valido