[PATCH/expand] PR64011 Adjust bitsize when partial overflow happen for big-endian

Jiong Wang jiong.wang@arm.com
Wed Jan 14 23:15:00 GMT 2015


On 13/01/15 21:45, Jeff Law wrote:
> On 01/09/15 06:39, Jiong Wang wrote:
>
>> the bug testcase is
>> ===================
>>
>> typedef short U __attribute__((may_alias, aligned (1)));
>> struct S
>> {
>>     _Complex float d __attribute__((aligned (8)));
>> };
>> void bar(struct S);
>> void f5 (int x)
>> {
>>     struct S s;
>>     ((U *)((char *) &s.d + 1))[3] = x;
>>     bar (s);
>> }
> So I'm going to focus on that assignment statement.  Doesn't that write
> outside the bounds of "s"?    If I'm reading everything correctly we
> have an object that is 8 bytes (a complex float).  The assignment is a 2
> byte write starting at byte 7 in the object.  ISTM that writes one byte
> beyond the underlying object, at which point we're in undefined
> behaviour territory.
>
> In many ways having the compiler or assembler spitting out an error here
> is preferable to silently compiling the code.  That would also help
> explain why we haven't seen this on other big endian targets with rich
> bitfield support (PA and H8 come to mind) -- it only arises in cases of
> undefined behaviour AFAICT.
>
> What I do not like is the ICE or unrecognizable insn error.

currently, if a backend define "insv" with strict operand constraints to reject
negative imm, for example ARM, will ICE as unrecognizable error.

> I'm really tempted here to use the conditional you want to add to
> store_bit_field_using_insv and when it triggers issue an error/warning
> instead of or in addition to truncating the size of the assignment.

agree, and I think the truncation is needed otherwise there may have ICE on some target.

and I found current gcc LOCATION info is very good !
have done an experimental hack on at "expand_assignment": 4931 where the tree is expanded,
gcc could give quite useful & accurate warning based on tree LOCATION info.

./cc1 -O2 -mbig-endian pr48335-2.c

pr48335-2.c: In function ‘f5’:
pr48335-2.c:19:29: warning: overflow here !
    ((U *)((char *) &s.d + 1))[3] = x;
                              ^

while we need to add warning at store_bit_field_using_insv where
there is no accurate LOCATION info. but looks like it's acceptable?

pr48335-2.c:19:33: warning: overflow here !
    ((U *)((char *) &s.d + 1))[3] = x;
                                  ^

>
> Thoughts?
>
> jeff
>
>
>
>
>
>




More information about the Gcc-patches mailing list