Advertencia C26487

No permita que una función devuelva un puntero no válido, ya sea a través de una instrucción de devolución formal o mediante parámetros de salida.

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

Comentarios

Las directrices de duración de C++ Core Guidelines describen un contrato que el código puede seguir, que permite una fuga de memoria estática más exhaustiva y la detección de punteros pendientes. Las ideas básicas que subyacen a las directrices son:

  • Nunca desreferenciar un puntero nulo no válido (pendiente) o conocido.
  • Nunca devolver, ya sea mediante una instrucción de devolución formal o un parámetro de salida, ningún puntero de una función.
  • Nunca pasar un puntero no válido (pendiente) a ninguna función.

Un puntero no válido está pendiente cuando apunta a algo que ya no está allí. Por ejemplo, cualquier puntero a una variable o parámetro local, una vez que se ha quedado fuera del ámbito. O bien, un puntero a un recurso que se ha eliminado. Incluso un puntero a un elemento estático puede estar pendiente si el valor se cambia antes de que se pueda usar. Un puntero pendiente solo es 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.

Consulte también