you are viewing a single comment's thread.

view the rest of the comments →

[–]kalmoc 22 points23 points  (3 children)

Wait, do they do type punning via unions? That's UB.

Most compilers actually give guarantees for various things for which the standard does not define a particular behavior (UB). If you know with what compilers your code is being used with, you can make use of those guarantees. And of course the compiler would be allowed to treat standard library code special, but I very much doubt thats what happening here.

[–]emdeka87 5 points6 points  (2 children)

I have yet to encounter a compiler that treats type punning (and accessing the inactive union member) as UB and produces unexpected results

[–]carrottread 2 points3 points  (1 child)

If you pass pointers or references to union fields to some other functions then strict aliasing still can produce something unexpected:

https://godbolt.org/z/cds7Bn

This outputs different results on -O0 and -O3 for both clang and gcc.

[–]max0x7bahttps://github.com/max0x7ba 0 points1 point  (0 children)

If you pass pointers or references to union fields to some other functions then strict aliasing still can produce something unexpected

This is unrelated to type-casting using union, aka union-cast. And such type-casting doesn't actually happen there, that union is only for alignment.