Partager via


Avertissement C26816

Le pointeur pointe vers la mémoire allouée sur la pile (ES.65)

Notes

Le pointeur pointe vers une variable allouée sur la pile. Lorsque la variable est hors de portée, elle est nettoyée, ce qui entraîne l’invalidation du pointeur.

Cette vérification reconnaît les vues et les propriétaires de la bibliothèque de modèles standard C++ (STL). Pour en savoir plus sur les types créés par l’utilisateur, utilisez l’annotation [[msvc::lifetimebound]] . La [[msvc::lifetimebound]] prise en charge est nouvelle dans MSVC 17.7.

Nom de l’analyse du code : LIFETIME_LOCAL_USE_AFTER_FREE_STACK

Exemples

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

Le correctif consiste à prolonger la durée de vie de la valeur utilisée. Dans cet exemple, nous adressons l’avertissement en retournant la chaîne std ::. Elle peut également être traitée en copiant les données dans le tas ou en ajoutant une variable « out » à la liste des paramètres de fonction.

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

Voir aussi

C26815
ES.65 : Ne pas déréférer un pointeur non valide