On Sat, Jan 20, 2018 at 8:31 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Fri, Jan 19, 2018 at 7:57 PM, Martin Sebor <mse...@gmail.com> wrote:
>> On 01/19/2018 10:14 AM, Martin Sebor wrote:
>>>
>
>> After reading the Clang code review for the warning
>> (https://reviews.llvm.org/D20561) and experimenting with a few
>> more test cases I noticed some additional false negatives that
>> I think would be worthwhile diagnosing:
>>
>>   struct A {
>>     int i;
>>   } __attribute__ ((packed));
>>
>>   int f (struct A *p)
>>   {
>>     return *&p->i;
>>   }
>
> I now got
>
> [hjl@gnu-tools-1 pr51628]$ cat a1.i
> struct A {
>   int i;
> } __attribute__ ((packed));
>
> int f (struct A *p)
> {
>   return *&p->i;
> }
> [hjl@gnu-tools-1 pr51628]$ make a1.s
> /export/build/gnu/gcc/build-x86_64-linux/gcc/xgcc
> -B/export/build/gnu/gcc/build-x86_64-linux/gcc/ -O2 -S a1.i
> a1.i: In function ‘f’:
> a1.i:7:10: warning: taking address of packed member of ‘struct A’ may
> result in an unaligned pointer value [-Waddress-of-packed-member]
>    return *&p->i;
>           ^~~~~~
> [hjl@gnu-tools-1 pr51628]$


It is wrong to warn "*&p->i;" since GCC always converts to "p->i;".  Unless
we want to warn

[hjl@gnu-tools-1 pr51628]$ cat g5.i
struct A {
  int i;
} __attribute__ ((packed));

int f (struct A *p)
{
  return p->i;
}

we shouldn't warn:

[hjl@gnu-tools-1 pr51628]$ cat a1.i
struct A {
  int i;
} __attribute__ ((packed));

int f (struct A *p)
{
  return *&p->i;
}
[hjl@gnu-tools-1 pr51628]$

There is no unaligned load here.  I am testing a new patch.

-- 
H.J.

Reply via email to