История изменений
Исправление 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 будет после записи в оригинальный объект всегда. И тогда они по-прежнему останутся «не пересекающимися», если в коде так написано.