gcc/libgcc
H.J. Lu da77eace90 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.

From-SVN: r267313
2018-12-20 13:41:48 -08:00
..
config [ARM] Optimize executable size when using softfloat fmul/dmul 2018-12-19 17:34:18 +00:00
soft-fp Update soft-fp from glibc. 2018-11-08 16:26:28 +00:00
ChangeLog C/C++: Add -Waddress-of-packed-member 2018-12-20 13:41:48 -08:00
config.host or1k: libgcc: initial support for openrisc 2018-11-09 12:09:15 +00:00
config.in
configure Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00
configure.ac Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00
crtstuff.c * crtstuff.c: Remove declaration of _Jv_RegisterClasses. 2018-05-30 17:21:48 -06:00
dfp-bit.c
dfp-bit.h
divmod.c udivmodsi4.c (__udivmodsi4): Rename to conform to coding standard. 2018-10-18 14:01:15 -04:00
empty.mk
emutls.c
enable-execute-stack-empty.c
enable-execute-stack-mprotect.c
find-symver.awk
fixed-bit.c
fixed-bit.h
fixed-obj.mk
floatunsidf.c
floatunsisf.c
floatunsitf.c
floatunsixf.c
fp-bit.c
fp-bit.h
gbl-ctors.h
gcov.h
gen-fixed.sh
generic-morestack-thread.c
generic-morestack.c re PR libgcc/86213 (-fsplit-stack runtime may clobber SSE input param reg) 2018-06-20 21:11:23 +00:00
generic-morestack.h
gstdint.h
gthr-posix.h
gthr-single.h
gthr.h
libgcc2.c libgcc2.c (isnan): Use __builtin_isnan. 2018-10-03 22:29:10 +02:00
libgcc2.h
libgcc-std.ver.in
libgcov-driver-system.c Fix libgcov-driver-system bootstrap failure (PR bootstrap/86057). 2018-06-07 04:21:35 +00:00
libgcov-driver.c Remove arc profile histogram in non-LTO mode. 2018-09-21 08:41:17 +00:00
libgcov-interface.c
libgcov-merge.c
libgcov-profiler.c Revert partially changes from r265454 (PR other/87735). 2018-10-25 15:36:12 +00:00
libgcov-util.c Remove arc profile histogram in non-LTO mode. 2018-09-21 08:41:17 +00:00
libgcov.h Fix divergence in indirect profiling (PR gcov-profile/84107). 2018-10-04 12:41:14 +00:00
Makefile.in libgcc: apply LIB2FUNCS_EXCLUDE logic to LIB2FUNCS_ST 2018-10-17 18:39:48 +00:00
memcmp.c
memcpy.c
memmove.c
memset.c
mkheader.sh
mkmap-flat.awk
mkmap-symver.awk
offloadstuff.c
shared-object.mk
siditi-object.mk
static-object.mk
sync.c
udivhi3.c udivmodsi4.c (__udivmodsi4): Rename to conform to coding standard. 2018-10-18 14:01:15 -04:00
udivmod.c udivmodsi4.c (__udivmodsi4): Rename to conform to coding standard. 2018-10-18 14:01:15 -04:00
udivmodhi4.c * udivmodhi4.c (__udivmodhi4): Fix loop end check. 2018-12-05 09:25:11 -05:00
udivmodsi4.c udivmodsi4.c (__udivmodsi4): Rename to conform to coding standard. 2018-10-18 14:01:15 -04:00
unwind-arm-common.inc
unwind-c.c
unwind-compat.c
unwind-compat.h
unwind-dw2-fde-compat.c
unwind-dw2-fde-dip.c
unwind-dw2-fde.c
unwind-dw2-fde.h
unwind-dw2.c
unwind-dw2.h
unwind-generic.h libgcc/CET: Skip signal frames when unwinding shadow stack 2018-04-19 10:05:39 -07:00
unwind-pe.h C/C++: Add -Waddress-of-packed-member 2018-12-20 13:41:48 -08:00
unwind-seh.c
unwind-sjlj.c
unwind.inc libgcc/CET: Skip signal frames when unwinding shadow stack 2018-04-19 10:05:39 -07:00
vtv_end_preinit.c
vtv_end.c
vtv_start_preinit.c
vtv_start.c