PING^1: [PATCH] C/C++: Add -Waddress-of-packed-member
H.J. Lu
hjl.tools@gmail.com
Mon May 14 13:47:00 GMT 2018
On Wed, Apr 25, 2018 at 7:54 PM, H.J. Lu <hongjiu.lu@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.
More information about the Gcc-patches
mailing list