LINUX.ORG.RU

История изменений

Исправление Ivan_qrt, (текущая версия) :

и компилятор решит, что поскольку записей в int32_t не было, результат чтения по указателю можно переиспользовать

Почему он так решит? Читается указатель на float и надо ли его перечитывать определяется именно им. int32_t в данном случае копия.

Но даже если было бы и так, то когда я попробую считать заново - тогда и появится проблема. А именно будет пересечение доступа через разные типы. Поменял через один тип, считал через ссылку на другой. И тогда согласен, нарушение и UB. Сам по себе доступ проблем не вызовет и его запрещать нет смысла.

А разве два динамических объектных файла в одном адресном пространстве — это две разные well-defined program?

Тема тонкая и возможно я не прав, но если это не так, то тогда является ли программа well defined зависит от того, какие библиотеки находятся в системе и какое ядро загружено. Это по-моему перебор даже для C++.

А ещё компиляторы умеют (и имеют право) менять обращения к памяти местами

Но они не могут поставить запись после чтения, если в коде до. Соответственно reinterpret_cast будет после записи в оригинальный объект всегда. И тогда они по-прежнему останутся «не пересекающимися», если в коде так написано.

Исходная версия Ivan_qrt, :

и компилятор решит, что поскольку записей в int32_t не было, результат чтения по указателю можно переиспользовать

Почему он так решит? Читается указатель на float и надо ли его перечитывать определяется именно им. int32_t в данном случае копия.

Но даже если было бы и так, то когда я попробую считать заново - тогда и появится проблема. А именно будет пересечение доступа через разные типы. Поменял через один тип, считал через другой. И тогда согласен, нарушение и UB. Сам по себе доступ проблем не вызовет и его запрещать нет смысла.

А разве два динамических объектных файла в одном адресном пространстве — это две разные well-defined program?

Тема тонкая и возможно я не прав, но если это не так, то тогда является ли программа well defined зависит от того, какие библиотеки находятся в системе и какое ядро загружено. Это по-моему перебор даже для C++.

А ещё компиляторы умеют (и имеют право) менять обращения к памяти местами

Но они не могут поставить запись после чтения, если в коде до. Соответственно reinterpret_cast будет после записи в оригинальный объект всегда. И тогда они по-прежнему останутся «не пересекающимися», если в коде так написано.