6.6.6.6.21 -fstrict-aliasing
Allows the compiler to assume the strictest aliasing rules applicable to the language being
compiled. For 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;
}