C Language Desreferenciación de un puntero a una variable más allá de su vida útil


Ejemplo

int* foo(int bar)
{
    int baz = 6;
    baz += bar;
    return &baz; /* (&baz) copied to new memory location outside of foo. */
} /* (1) The lifetime of baz and bar end here as they have automatic storage   
   * duration (local variables), thus the returned pointer is not valid! */

int main (void)
{
    int* p;

    p = foo(5);  /* (2) this expression's behavior is undefined */
    *p = *p - 6; /* (3) Undefined behaviour here */

    return 0;
}

Algunos compiladores lo señalan de manera útil. Por ejemplo, gcc advierte con:

warning: function returns address of local variable [-Wreturn-local-addr]

y clang advierte con:

warning: address of stack memory associated with local variable 'baz' returned 
[-Wreturn-stack-address]

para el código anterior. Pero los compiladores pueden no ser capaces de ayudar en código complejo.

(1) La referencia de retorno a la variable static declarada es un comportamiento definido, ya que la variable no se destruye después de dejar el alcance actual.

(2) De acuerdo con ISO / IEC 9899: 2011 6.2.4 §2, "El valor de un puntero se vuelve indeterminado cuando el objeto al que apunta llega al final de su vida útil".

(3) Eliminar la referencia del puntero devuelto por la función foo es un comportamiento indefinido ya que la memoria a la que hace referencia tiene un valor indeterminado.