6.7.6.6.22 -fstrict-aliasing
Allows the compiler to assume the strictest aliasing rules applicable to the language being
compiled. For C/C++, this activates optimizations based on the type of expressions. In
particular, an object of one type is assumed never to reside at the same address as an
object of a different type, unless the types are almost the same. For example, an
unsigned int can alias an int, but not a
void* or a double. A character type may alias any
other type.
Pay special attention to code like this:
union a_union {
int i;
double d;
};
int f() {
union a_union t;
t.d = 3.0;
return t.i;
}
The practice of reading from a different union member than the one most
recently written to (called “type-punning”) is common. Even with
-fstrict-aliasing, type-punning is allowed, provided the memory is
accessed through the union type. So the code above will work as expected, but the
following code might not:
int f() {
a_union t;
int* ip;
t.d = 3.0;
ip = &t.i;
return *ip;
}
