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.