In order:
-
Yes. GCC will assume that the pointers cannot alias. For instance, if you assign through one then read from the other, GCC may, as an optimisation, reorder the read and write – I have seen this happen in production code, and it is not pleasant to debug.
-
Several. You could use a union to represent the memory you need to reinterpret. You could use a
reinterpret_cast
. You could cast viachar *
at the point where you reinterpret the memory –char *
are defined as being able to alias anything. You could use a type which has__attribute__((__may_alias__))
. You could turn off the aliasing assumptions globally using -fno-strict-aliasing. -
__attribute__((__may_alias__))
on the types used is probably the closest you can get to disabling the assumption for a particular section of code.
For your particular example, note that the size of an enum is ill defined; GCC generally uses the smallest integer size that can be used to represent it, so reinterpreting a pointer to an enum as an integer could leave you with uninitialised data bytes in the resulting integer. Don’t do that. Why not just cast to a suitably large integer type?