On Wed, Apr 25, 2018 at 7:54 PM, H.J. Lu <hongjiu...@intel.com> wrote: > 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] > 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:33: warning: taking value of packed 'struct C *' may result in an > unaligned pointer value [-Waddress-of-packed-member] > long* g8 (struct C *p) { return p; } > ^ > $ > > 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. > > OK for trunk? > > H.J. > ---- > gcc/c/ > > PR c/51628 > * doc/invoke.texi: Document -Wno-address-of-packed-member. > > gcc/c-family/ > > PR c/51628 > * c-common.h (warn_for_address_of_packed_member): New. > * c-warn.c (check_address_of_packed_member): New function. > (warn_for_address_of_packed_member): Likewise. > * c.opt: Add -Wno-address-of-packed-member. > > gcc/c/ > > PR c/51628 > * c-typeck.c (warn_for_pointer_of_packed_member): New function. > (convert_for_assignment): Call warn_for_address_of_packed_member > and warn_for_pointer_of_packed_member. > > gcc/cp/ > > PR c/51628 > * call.c (convert_for_arg_passing): Call > warn_for_address_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. > * gcc.dg/pr51628-16.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. > * 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.
Jason, Joseph, is this https://gcc.gnu.org/ml/gcc-patches/2018-04/msg01155.html OK for trunk? -- H.J.