5.7.7.43 Strict-aliasing Option
The -fstrict-aliasing
option 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.
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. The code above works as expected. However, this code might not:int f() {
a_union t;
int * ip;
t.d = 3.0;
ip = &t.i;
return *ip;
}
This option is automatically enabled at optimization levels -O2
, -O3
, and -Os
.
-fno-strict-aliasing
form of this option relaxes the aliasing rules, preventing some optimizations from being performed.