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