Clarification on Gcc's strict aliasing rules

Francis Moreau francis.moro@gmail.com
Fri Nov 12 19:46:00 GMT 2010


"Segher Boessenkool" <segher@kernel.crashing.org> writes:

>> But you finally said
>>
>>     - you can not access it as int:
>>
>>         that object (t.i) does not have a stored value therefore it
>>         doesn't exist.
>
> (Your words, not mine -- and such sloppy wording gets you into trouble,
> the standard does not talk about any of this.  It is one way of looking
> at it though).

So what did you mean by this ?

   > could you tell me what the effective type of 't.i' object ?
   
   int, if you can say that object exists at all: it does not have a stored
   value.  The stored value of t is a double with value 3.0 .  You can
   take its address and access it via that as "double" (or "char"), or you
   can access it as the union it is.  You can not access it as "int".

>> This is what I understood from what you said, please correct me if I'm
>> wrong.
>>
>> However doing:
>>
>>      int i = t.i;
>>
>> is defined in C (as long as there's no trap representation) even if 't.i'
>> object has no stored value.
>
> Actually, I think this is a GCC extension, and I was mistaken to say it
> is valid C99 before.  Standard C allows you to read from t.d or t, but not
> t.i, after storing into t.d .

No.

   t.d = 3.0;
   i = t.i;

is well defined in C.

Again, what's ambiguous is the example given by the GCC man:

   int *ip;
   t.d = 3.0;
   ip = &t.i;
   return *ip;

which produces code that might or not work.

6.5p7 lists this as a possible alias case and I can't find any rule in
the standard that could invalidate it.

So either GCC is not conformant in this regard or I'm missing something.

Thanks
-- 
Francis



More information about the Gcc-help mailing list