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