Разрешено ли компилятору освобождать переменные указателя?
Было заявлено, что
компилятор может повторно использовать переменную-указатель для других целей послереаллок быть освобожденнымТаким образом, вы не можете гарантировать, что он имеет то же значение, что и раньше
т.е.
void *p = malloc(42);
uintptr_t address = (uintptr_t)p;
free(p);
// [...] stuff unrelated to p or address
assert((uintptr_t)p == address);
может потерпеть неудачу.
Приложение C.2 J11 гласит:
Используется значение указателя, которое ссылается на пространство, освобожденное при вызове функции free или realloc (7.22.3) [не определено]
но приложение конечно не нормативное.
Приложение L.3 (которое является нормативным, но необязательным) говорит нам, что если
Используется значение указателя, которое ссылается на пространство, освобожденное при вызове функции free или realloc (7.22.3).
результат может быть критическим неопределенным поведением.
Это подтверждает претензию, но я хотел бы видеть соответствующую цитату из самого стандарта вместо приложения.