Il compilatore è autorizzato a riciclare variabili di puntatore liberate?

È stato affermato che

un compilatore è libero di riutilizzare la variabile puntatore per qualche altro scopo dopo il realloc essere liberato , quindi non si ha alcuna garanzia che abbia lo stesso valore di prima

vale a dire

void *p = malloc(42); uintptr_t address = (uintptr_t)p; free(p); // [...] stuff unrelated to p or address assert((uintptr_t)p == address); 

potrebbe fallire.

C11 allegato J.2 recita

Viene utilizzato il valore di un puntatore che fa riferimento allo spazio deallocato da una chiamata alla funzione libera o realloc (7.22.3) [ non definito ]

ma l’annesso non è certamente normativo.

L’allegato L.3 (che è normativo, ma facoltativo) ci dice che se

Viene utilizzato il valore di un puntatore che fa riferimento allo spazio deallocato da una chiamata alla funzione libera o realloc (7.22.3).

il risultato può essere un comportamento critico indefinito.

Ciò conferma il reclamo, ma mi piacerebbe vedere una citazione appropriata dallo standard corretto anziché dall’allegato.