Union initialization semantics
Jonathan Wakely
jwakely.gcc@gmail.com
Wed Jun 19 12:59:32 GMT 2024
On Wed, 19 Jun 2024 at 11:57, Alexander Monakov <amonakov@ispras.ru> wrote:
>
> Hello,
>
> I vaguely remember there was a recent, maybe within last two months, discussion
> about semantics of union initialization where sizeof(first member) is less than
> sizeof(union). The question was whether it's okay to initialize just that first
> member and leave garbage bits in the other, larger, members of the union, like
> in this example:
>
> union A {
> char a;
> long : 0;
> };
>
> void fn(void *);
>
> void my(void)
> {
> union A a = { 0 };
> fn(&a);
> }
>
> (except in my example there's no other named member, but I think the example
> in that discussion was less contrived)
>
> Perhaps somebody remembers where it was (I'm thinking Bugzilla) and could point
> me to it? My attempts to search for it aren't turning anything up so far.
Somebody asked about this internally at Red Hat recently, and I
responded with this quote from C17 6.2.6.1 p7:
"When a value is stored in a member of an object of union type, the
bytes of the object representation that do not correspond to that
member but do correspond to other members take unspecified values. "
This looks related too:
https://discourse.llvm.org/t/union-initialization-and-aliasing-clang-18-seems-to-miscompile-musl/77724/3
They don't seem to have found the quote above though.
I think it got reported to GCC's bugzilla too, I'll see if I can find it again.
> If someone knows what semantics GCC implements, that also would be welcome.
GCC seems to initialize the trailing bits, unnecessarily.
More information about the Gcc
mailing list