C Language Dereferenziare un puntatore alla variabile oltre la sua durata


Esempio

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

Alcuni compilatori lo segnalano utilmente. Ad esempio, gcc avvisa con:

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

e clang avverte con:

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

per il codice sopra. Ma i compilatori potrebbero non essere in grado di aiutare nel codice complesso.

(1) Il ritorno del riferimento alla variabile dichiarata static è un comportamento definito, in quanto la variabile non viene distrutta dopo aver abbandonato l'ambito corrente.

(2) Secondo ISO / IEC 9899: 2011 6.2.4 §2, "Il valore di un puntatore diventa indeterminato quando l'oggetto a cui punta raggiunge la fine della sua vita."

(3) Il dereferenziamento del puntatore restituito dalla funzione foo è un comportamento indefinito in quanto la memoria a cui fa riferimento detiene un valore indeterminato.