Avviso C26487

Non consentire a una funzione di restituire un puntatore non valido, tramite un'istruzione return formale o tramite parametri di output.

int* ex1(int a)
{
  return &a;     // returns a dangling pointer to the stack variable 'a'
}

void ex2(int a, int** out)
{
  *out = &a;    // 'out' contains a dangling pointer to the stack variable 'a'
}

Osservazioni:

Le linee guida per la durata delle linee guida di base di C++ delineano un contratto che il codice può seguire, che consente una perdita di memoria statica più approfondita e il rilevamento di puntatori. Le idee di base alle linee guida sono:

  • Non dereferenziare mai un puntatore null o un puntatore null non valido.Never dereference an invalid (dangling) or known-null pointer.
  • Non restituire mai, tramite un'istruzione restituita formale o un parametro out, qualsiasi puntatore incerto da una funzione.
  • Non passare mai un puntatore (dangling) non valido a qualsiasi funzione.

Un puntatore non valido è incerto quando punta a qualcosa che non c'è più. Ad esempio, qualsiasi puntatore a una variabile o a un parametro locale, una volta che non rientra nell'ambito. In alternativa, un puntatore a una risorsa eliminata. Anche un puntatore a un oggetto statico può essere infastinato, se il valore viene modificato prima che possa essere usato. Un puntatore dangling era una volta valido; questo è ciò che lo distingue da altri tipi di puntatori non validi, ad esempio un puntatore non inizializzato, o nullptr.

Vedi anche