https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51628

--- Comment #54 from hjl at gcc dot gnu.org <hjl at gcc dot gnu.org> ---
Author: hjl
Date: Thu Dec 20 21:41:48 2018
New Revision: 267313

URL: https://gcc.gnu.org/viewcvs?rev=267313&root=gcc&view=rev
Log:
C/C++: Add -Waddress-of-packed-member

When address of packed member of struct or union is taken, it may result
in an unaligned pointer value.  This patch adds -Waddress-of-packed-member
to check alignment at pointer assignment and warn unaligned address as
well as unaligned pointer:

$ cat x.i
struct pair_t
{
  char c;
  int i;
} __attribute__ ((packed));

extern struct pair_t p;
int *addr = &p.i;
$ gcc -O2 -S x.i
x.i:8:13: warning: taking address of packed member of ‘struct pair_t’ may
result in an unaligned pointer value [-Waddress-of-packed-member]
8 | int *addr = &p.i;
  |             ^

$ cat c.i
struct B { int i; };
struct C { struct B b; } __attribute__ ((packed));

long* g8 (struct C *p) { return p; }
$ gcc -O2 -S c.i -Wno-incompatible-pointer-types
c.i: In function ‘g8’:
c.i:4:18: warning: converting a packed ‘struct C *’ pointer (alignment 1) to
‘long int *’ (alignment 8) may may result in an unaligned pointer value
[-Waddress-of-packed-member]
4 | long* g8 (struct C *p) { return p; }
  |                  ^
c.i:2:8: note: defined here
2 | struct C { struct B b; } __attribute__ ((packed));
  |        ^
$

This warning is enabled by default.  Since read_encoded_value_with_base
in unwind-pe.h has

  union unaligned
    {
      void *ptr;
      unsigned u2 __attribute__ ((mode (HI)));
      unsigned u4 __attribute__ ((mode (SI)));
      unsigned u8 __attribute__ ((mode (DI)));
      signed s2 __attribute__ ((mode (HI)));
      signed s4 __attribute__ ((mode (SI)));
      signed s8 __attribute__ ((mode (DI)));
    } __attribute__((__packed__));
  _Unwind_Internal_Ptr result;

and GCC warns:

gcc/libgcc/unwind-pe.h:210:37: warning: taking address of packed member of
'union unaligned' may result in an unaligned pointer value
[-Waddress-of-packed-member]
    result = (_Unwind_Internal_Ptr) u->ptr;
                                    ^
we need to add GCC pragma to ignore -Waddress-of-packed-member.

gcc/

        PR c/51628
        * doc/invoke.texi: Document -Wno-address-of-packed-member.

gcc/c-family/

        PR c/51628
        * c-common.h (warn_for_address_or_pointer_of_packed_member): New.
        * c-warn.c (check_alignment_of_packed_member): New function.
        (check_address_of_packed_member): Likewise.
        (check_and_warn_address_of_packed_member): Likewise.
        (warn_for_address_or_pointer_of_packed_member): Likewise.
        * c.opt: Add -Wno-address-of-packed-member.

gcc/c/

        PR c/51628
        * c-typeck.c (convert_for_assignment): Call
        warn_for_address_or_pointer_of_packed_member.

gcc/cp/

        PR c/51628
        * call.c (convert_for_arg_passing): Call
        warn_for_address_or_pointer_of_packed_member.
        * typeck.c (convert_for_assignment): Likewise.

gcc/testsuite/

        PR c/51628
        * c-c++-common/pr51628-1.c: New test.
        * c-c++-common/pr51628-2.c: Likewise.
        * c-c++-common/pr51628-3.c: Likewise.
        * c-c++-common/pr51628-4.c: Likewise.
        * c-c++-common/pr51628-5.c: Likewise.
        * c-c++-common/pr51628-6.c: Likewise.
        * c-c++-common/pr51628-7.c: Likewise.
        * c-c++-common/pr51628-8.c: Likewise.
        * c-c++-common/pr51628-9.c: Likewise.
        * c-c++-common/pr51628-10.c: Likewise.
        * c-c++-common/pr51628-11.c: Likewise.
        * c-c++-common/pr51628-12.c: Likewise.
        * c-c++-common/pr51628-13.c: Likewise.
        * c-c++-common/pr51628-14.c: Likewise.
        * c-c++-common/pr51628-15.c: Likewise.
        * c-c++-common/pr51628-26.c: Likewise.
        * c-c++-common/pr51628-27.c: Likewise.
        * c-c++-common/pr51628-28.c: Likewise.
        * c-c++-common/pr51628-29.c: Likewise.
        * c-c++-common/pr51628-30.c: Likewise.
        * c-c++-common/pr51628-31.c: Likewise.
        * c-c++-common/pr51628-32.c: Likewise.
        * gcc.dg/pr51628-17.c: Likewise.
        * gcc.dg/pr51628-18.c: Likewise.
        * gcc.dg/pr51628-19.c: Likewise.
        * gcc.dg/pr51628-20.c: Likewise.
        * gcc.dg/pr51628-21.c: Likewise.
        * gcc.dg/pr51628-22.c: Likewise.
        * gcc.dg/pr51628-23.c: Likewise.
        * gcc.dg/pr51628-24.c: Likewise.
        * gcc.dg/pr51628-25.c: Likewise.
        * c-c++-common/asan/misalign-1.c: Add
        -Wno-address-of-packed-member.
        * c-c++-common/asan/misalign-2.c: Likewise.
        * c-c++-common/ubsan/align-2.c: Likewise.
        * c-c++-common/ubsan/align-4.c: Likewise.
        * c-c++-common/ubsan/align-6.c: Likewise.
        * c-c++-common/ubsan/align-7.c: Likewise.
        * c-c++-common/ubsan/align-8.c: Likewise.
        * c-c++-common/ubsan/align-10.c: Likewise.
        * g++.dg/ubsan/align-2.C: Likewise.
        * gcc.target/i386/avx512bw-vmovdqu16-2.c: Likewise.
        * gcc.target/i386/avx512f-vmovdqu32-2.c: Likewise.
        * gcc.target/i386/avx512f-vmovdqu64-2.c: Likewise.
        * gcc.target/i386/avx512vl-vmovdqu16-2.c: Likewise.
        * gcc.target/i386/avx512vl-vmovdqu32-2.c: Likewise.
        * gcc.target/i386/avx512vl-vmovdqu64-2.c: Likewise.

libgcc/

        * unwind-pe.h (read_encoded_value_with_base): Add GCC pragma
        to ignore -Waddress-of-packed-member.

Added:
    trunk/gcc/testsuite/c-c++-common/pr51628-1.c
    trunk/gcc/testsuite/c-c++-common/pr51628-10.c
    trunk/gcc/testsuite/c-c++-common/pr51628-11.c
    trunk/gcc/testsuite/c-c++-common/pr51628-12.c
    trunk/gcc/testsuite/c-c++-common/pr51628-13.c
    trunk/gcc/testsuite/c-c++-common/pr51628-14.c
    trunk/gcc/testsuite/c-c++-common/pr51628-15.c
    trunk/gcc/testsuite/c-c++-common/pr51628-16.c
    trunk/gcc/testsuite/c-c++-common/pr51628-2.c
    trunk/gcc/testsuite/c-c++-common/pr51628-26.c
    trunk/gcc/testsuite/c-c++-common/pr51628-27.c
    trunk/gcc/testsuite/c-c++-common/pr51628-28.c
    trunk/gcc/testsuite/c-c++-common/pr51628-29.c
    trunk/gcc/testsuite/c-c++-common/pr51628-3.c
    trunk/gcc/testsuite/c-c++-common/pr51628-30.c
    trunk/gcc/testsuite/c-c++-common/pr51628-31.c
    trunk/gcc/testsuite/c-c++-common/pr51628-32.c
    trunk/gcc/testsuite/c-c++-common/pr51628-4.c
    trunk/gcc/testsuite/c-c++-common/pr51628-5.c
    trunk/gcc/testsuite/c-c++-common/pr51628-6.c
    trunk/gcc/testsuite/c-c++-common/pr51628-7.c
    trunk/gcc/testsuite/c-c++-common/pr51628-8.c
    trunk/gcc/testsuite/c-c++-common/pr51628-9.c
    trunk/gcc/testsuite/gcc.dg/pr51628-17.c
    trunk/gcc/testsuite/gcc.dg/pr51628-18.c
    trunk/gcc/testsuite/gcc.dg/pr51628-19.c
    trunk/gcc/testsuite/gcc.dg/pr51628-20.c
    trunk/gcc/testsuite/gcc.dg/pr51628-21.c
    trunk/gcc/testsuite/gcc.dg/pr51628-22.c
    trunk/gcc/testsuite/gcc.dg/pr51628-23.c
    trunk/gcc/testsuite/gcc.dg/pr51628-24.c
    trunk/gcc/testsuite/gcc.dg/pr51628-25.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/c-family/ChangeLog
    trunk/gcc/c-family/c-common.h
    trunk/gcc/c-family/c-warn.c
    trunk/gcc/c-family/c.opt
    trunk/gcc/c/ChangeLog
    trunk/gcc/c/c-typeck.c
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/call.c
    trunk/gcc/cp/typeck.c
    trunk/gcc/doc/invoke.texi
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/c-c++-common/asan/misalign-1.c
    trunk/gcc/testsuite/c-c++-common/asan/misalign-2.c
    trunk/gcc/testsuite/c-c++-common/ubsan/align-10.c
    trunk/gcc/testsuite/c-c++-common/ubsan/align-2.c
    trunk/gcc/testsuite/c-c++-common/ubsan/align-4.c
    trunk/gcc/testsuite/c-c++-common/ubsan/align-6.c
    trunk/gcc/testsuite/c-c++-common/ubsan/align-7.c
    trunk/gcc/testsuite/c-c++-common/ubsan/align-8.c
    trunk/gcc/testsuite/g++.dg/ubsan/align-2.C
    trunk/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-2.c
    trunk/gcc/testsuite/gcc.target/i386/avx512f-vmovdqu32-2.c
    trunk/gcc/testsuite/gcc.target/i386/avx512f-vmovdqu64-2.c
    trunk/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu16-2.c
    trunk/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu32-2.c
    trunk/gcc/testsuite/gcc.target/i386/avx512vl-vmovdqu64-2.c
    trunk/libgcc/ChangeLog
    trunk/libgcc/unwind-pe.h

Reply via email to