Re[4]: Как обойти strict aliasing rule?
От: alexanius  
Дата: 20.06.16 14:18
Оценка:
Здравствуйте, Eeel, Вы писали:

E>Здравствуйте, alexanius, Вы писали:


A>>А вот тут один интересный момент. В стандарте не говорится что это UB. Более того, там есть сноска в которой утверждается что в подобной ситуации происходит реинтерпретация данного участка памяти. По идее с точки зрения strict-aliasing здесь тоже всё должно быть нормально.


A>>

A>>6.5.2.3 Structure and union members
A>>...


E>Это секция стандарта C99 ("чистого си"), а не C++. Насколько я понимаю, в C++ этот момент отличается (что плохо).


Это 9899:201x, т.е. черновик C11. Но я даже могу более интересную цитаты из старого черновика привести. Вот, например, цитата из 9899:TC2 (черновик C99)

6.5.2.3 Structure and union members

EXAMPLE 3
The following is a valid fragment:

union {
struct {
int alltypes;
} n;

struct {
int type;
int intnode;
} ni;

struct {
int type;
double doublenode;
} nf;
} u;

u.nf.type = 1;
u.nf.doublenode = 3.14;
/* ... */
if (u.n.alltypes == 1)
if (sin(u.nf.doublenode) == 0.0)
/* ... */


Вообще это действительно один из очень неприятных моментов стандарта, который прописан довольно туманно, и с которым постоянно возникают проблемы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.