O compilador pode reciclar variáveis de ponteiro liberadas?

Foi alegado que

um compilador é livre para reutilizar a variável ponteiro para algum outro propósito apóso realloc sendo libertado, então você não tem garantia de que ele tenha o mesmo valor que antes

ie

void *p = malloc(42);
uintptr_t address = (uintptr_t)p;
free(p);

// [...] stuff unrelated to p or address

assert((uintptr_t)p == address);

pode falhar.

O anexo C11 J.2 lê

O valor de um ponteiro que se refere ao espaço desalocado por uma chamada para a função free ou realloc é usado (7.22.3) [é indefinido]

mas é claro que o anexo não é normativo.

O anexo L.3 (que é normativo, mas opcional) nos diz que, se

O valor de um ponteiro que se refere ao espaço desalocado por uma chamada para a função free ou realloc é usado (7.22.3).

é permitido que o resultado seja um comportamento indefinido crítico.

Isso confirma a reivindicação, mas eu gostaria de ver uma citação apropriada da norma adequada, em vez do anexo.

questionAnswers(1)

yourAnswerToTheQuestion