Clarification on Gcc's strict aliasing rules
Francis Moreau
francis.moro@gmail.com
Mon Nov 15 14:00:00 GMT 2010
Andrew Haley <aph@redhat.com> writes:
> On 11/12/2010 07:45 PM, Francis Moreau wrote:
>> "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.
>
> It's worth looking at http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_236.htm
IMHO, I believe the standard broken in this regard and therefore GCC is
not conformant but for good reason.
--
Francis
More information about the Gcc-help
mailing list