C26487 LIFETIMES_FUNCTION_POSTCONDITION_VIOLATIONC26487 LIFETIMES_FUNCTION_POSTCONDITION_VIOLATION

No permita que una función devuelva un puntero no válido, ya sea mediante una instrucción return formal o mediante parámetros de salida.Don't allow a function to return an invalid pointer, either through a formal return statement or through output parameters.

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

ObservacionesRemarks

En las instrucciones de duración C++ de las directrices básicas se describe un contrato que el código puede seguir, lo que permite una pérdida de memoria estática más exhaustiva y la detección de punteros pendientes.The Lifetime guidelines from the C++ Core Guidelines outline a contract that code can follow which enables more thorough static memory leak and dangling pointer detection. Las ideas básicas subyacentes a las instrucciones son:The basic ideas behind the guidelines are:

  • Nunca desreferencia un puntero no válido (pendiente) o nulo conocido.Never dereference an invalid (dangling) or known-null pointer.
  • Nunca devuelva, ya sea por instrucción de devolución formal o por parámetro de salida, cualquier puntero pendiente de una función.Never return, either by formal return statement or out parameter, any dangling pointer from a function.
  • No pase nunca un puntero no válido (pendiente) a ninguna función.Never pass an invalid (dangling) pointer to any function.

Un puntero no válido está pendiente cuando apunta a algo que ya no existe.An invalid pointer is dangling when it points to something that isn't there anymore. Por ejemplo, cualquier puntero a una variable local o un parámetro, una vez fuera del ámbito.For example, any pointer to a local variable or parameter, once it's gone out of scope. O bien, un puntero a un recurso que se ha eliminado.Or, a pointer to a resource that's been deleted. Incluso un puntero a un estático puede estar pendiente, si se cambia el valor antes de que se pueda usar.Even a pointer to a static can be dangling, if the value gets changed before it can be used. Un puntero pendiente era válido una vez; eso es lo que lo distingue de otros tipos de punteros no válidos, como un puntero no inicializado o nullptr.A dangling pointer was once valid; that's what distinguishes it from other kinds of invalid pointers, such as an uninitialized pointer, or nullptr.

Consulte tambiénSee also