Advertencia C26816
El puntero apunta a la memoria asignada en la pila (ES.65)
Comentarios
El puntero apunta a una variable que está asignada en la pila. Cuando la variable sale del ámbito, se limpia, lo que hace que el puntero no sea válido.
Esta comprobación reconoce las vistas y los propietarios de la biblioteca de plantillas estándar (STL) de C++. Para enseñar esta comprobación sobre los tipos creados por el usuario, use la [[msvc::lifetimebound]]
anotación .
La [[msvc::lifetimebound]]
compatibilidad es nueva en MSVC 17.7.
Nombre del análisis de código: LIFETIME_LOCAL_USE_AFTER_FREE_STACK
Ejemplos
// 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 corrección pasa por extender la duración del valor que se usa. En este ejemplo, se soluciona la advertencia devolviendo std::string. También se puede solucionar copiando los datos en el montón o agregando una variable "out" a la lista de parámetros de función.
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();
}