3 ms·
Actually, the upcoming C1X standard makes type punning via union legal. In C99, alias analysis works behaves exactly as you said, but using unions to convert b
by chadaustin 15y ago
Actually, the upcoming C1X standard makes type punning via union legal. In C99, alias analysis works behaves exactly as you said, but using unions to convert between floats and ints is so common that it's legal in C1X, VC++, and I believe gcc.
- legooolas 15y agogcc does in some cases but not all (see http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Optimize-Options.html#index-fstrict_002daliasing-542 http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Optimize-Options... but not all). Still, the current standard says it's not legal so it seems like a bad idea to rely on undefined behaviour...
- cygx 15y agoType-punning through unions is already legal in C99, but there's a known error in Annex J, listing it incorrectly as unspecified behaviour. See http://stackoverflow.com/a/8513748/48015 http://stackoverflow.com/a/8513748/48015
- legooolas 15y agoI stand corrected :/
- cygx 15y agoDon't feel bad about it - the C standard can be quite subtle, and I've been known to spread lies about it as well. Things about which I have stumbled somewhat recently: * restrict-qualified pointer-to-const parameters do not guarantee that the pointed-to object won't be modified as restrict only applies if the pointer is actually used to access the object, which calling code can't know (ie restrict only enables optimizations in the called code and not reordering in calling code) * functions with differently qualified, but otherwise compatible parameter types have compatible type (which is only mentioned in the last, parenthesized sentence of section 6.7.5.3)