Compartir vía


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

Consulte también

C26815
ES.65: No desreferenciar un puntero no válido