Во-первых, чтобы уточнить, я не говорю о разыменовании недопустимых указателей!
Рассмотрим следующие два примера.
Пример 1
typedef struct { int *p; } T;
T a = { malloc(sizeof(int) };
free(a.p); // a.p is now indeterminate?
T b = a; // Access through a non-character type?
Пример 2
void foo(int *p) {}
int *p = malloc(sizeof(int));
free(p); // p is now indeterminate?
foo(p); // Access through a non-character type?
Вопрос
В любом из приведенных выше примеров вызывается поведение undefined?
Контекст
Этот вопрос задается в ответ на эту дискуссию. Предполагалось, что, например, аргументы указателя могут быть переданы функции через регистры сегментов x86, что может вызвать аппаратное исключение.
Из стандарта C99 мы узнаем следующее (основное внимание):
[3.17] неопределенное значение - либо неопределенное значение, либо представление ловушки
а затем:
[6.2.4 p2] Значение указателя становится неопределенным, когда объект, на который он указывает, достигает конца своего срока службы.
а затем:
[6.2.6.1 p5] Определенные представления объектов не обязательно должны представлять значение типа объекта. Если хранимое значение объекта имеет такое представление и считывается выражением lvalue, которое не имеет типа символа, поведение undefined. Если такое представление создается побочным эффектом, который изменяет всю или любую часть объекта выражением lvalue, которое не имеет типа символа, поведение undefined. Такое представление называется представлением ловушки.
Взяв все это вместе, какие ограничения мы имеем на доступ к указателям на "мертвые" объекты?
Добавление
Пока я цитировал вышеприведенный стандарт C99, мне было бы интересно узнать, отличается ли поведение от любого из стандартов С++.