Commit 0547dbb725b reduced the number of cases in which union padding bits are zeroed when the relevant language standard does not strictly require it, unless gcc was invoked with -fzero-init-padding-bits=unions or -fzero-init-padding-bits=all in order to explicitly request zeroing of padding bits.
This commit adds a closely related warning, -Wzero-init-padding-bits=, which is intended to help programmers to find code that might now need to be rewritten or recompiled with -fzero-init-padding-bits=unions or -fzero-init-padding-bits=all in order to replicate the behaviour that it had when compiled by older versions of GCC. It can also be used to find struct padding that was never previously guaranteed to be zero initialized and still isn't unless GCC is invoked with -fzero-init-padding-bits=all option. The new warning can be set to the same three states as -fzero-init-padding-bits ('standard', 'unions' or 'all') and has the same default value ('standard'). The two options interact as follows: f: standard f: unions f: all w: standard X X X w: unions U X X w: all A S X X = No warnings about padding U = Warnings about padding of unions. S = Warnings about padding of structs. A = Warnings about padding of structs and unions. The level of optimisation and whether or not the entire initializer is dropped to memory can both affect whether warnings are produced when compiling a given program. This is intentional, since tying the warnings more closely to the relevant language standard would require a very different approach that would still be target-dependent, might impose an unacceptable burden on programmers, and would risk not satisfying the intended use-case (which is closely tied to a specific optimisation). Bootstrapped the compiler and tested on AArch64 and x86-64 using some new tests for -Wzero-init-padding-bits and the existing tests for -fzero-init-padding-bits (check-gcc RUNTESTFLAGS="dg.exp=*-empty-init-*.c"). Base commit is a470433732e77ae29a717cf79049ceeea3cbe979 Changes in v2: - Add missing changelog entry. Link to v1: https://inbox.sourceware.org/gcc-patches/20250520104940.3546-1-chris.baz...@arm.com/ Christopher Bazley (1): Add warnings of potentially-uninitialized padding bits gcc/common.opt | 4 + gcc/doc/invoke.texi | 85 ++++++++++++++++++- gcc/expr.cc | 41 ++++----- gcc/expr.h | 7 +- gcc/gimplify.cc | 29 ++++++- gcc/testsuite/gcc.dg/c23-empty-init-warn-1.c | 68 +++++++++++++++ gcc/testsuite/gcc.dg/c23-empty-init-warn-10.c | 8 ++ gcc/testsuite/gcc.dg/c23-empty-init-warn-11.c | 8 ++ gcc/testsuite/gcc.dg/c23-empty-init-warn-12.c | 8 ++ gcc/testsuite/gcc.dg/c23-empty-init-warn-13.c | 8 ++ gcc/testsuite/gcc.dg/c23-empty-init-warn-14.c | 8 ++ gcc/testsuite/gcc.dg/c23-empty-init-warn-15.c | 8 ++ gcc/testsuite/gcc.dg/c23-empty-init-warn-16.c | 8 ++ gcc/testsuite/gcc.dg/c23-empty-init-warn-17.c | 51 +++++++++++ gcc/testsuite/gcc.dg/c23-empty-init-warn-2.c | 69 +++++++++++++++ gcc/testsuite/gcc.dg/c23-empty-init-warn-3.c | 7 ++ gcc/testsuite/gcc.dg/c23-empty-init-warn-4.c | 69 +++++++++++++++ gcc/testsuite/gcc.dg/c23-empty-init-warn-5.c | 8 ++ gcc/testsuite/gcc.dg/c23-empty-init-warn-6.c | 8 ++ gcc/testsuite/gcc.dg/c23-empty-init-warn-7.c | 8 ++ gcc/testsuite/gcc.dg/c23-empty-init-warn-8.c | 8 ++ gcc/testsuite/gcc.dg/c23-empty-init-warn-9.c | 69 +++++++++++++++ .../gcc.dg/gnu11-empty-init-warn-1.c | 52 ++++++++++++ .../gcc.dg/gnu11-empty-init-warn-10.c | 8 ++ .../gcc.dg/gnu11-empty-init-warn-11.c | 8 ++ .../gcc.dg/gnu11-empty-init-warn-12.c | 8 ++ .../gcc.dg/gnu11-empty-init-warn-13.c | 8 ++ .../gcc.dg/gnu11-empty-init-warn-14.c | 8 ++ .../gcc.dg/gnu11-empty-init-warn-15.c | 8 ++ .../gcc.dg/gnu11-empty-init-warn-16.c | 8 ++ .../gcc.dg/gnu11-empty-init-warn-17.c | 51 +++++++++++ .../gcc.dg/gnu11-empty-init-warn-2.c | 59 +++++++++++++ .../gcc.dg/gnu11-empty-init-warn-3.c | 7 ++ .../gcc.dg/gnu11-empty-init-warn-4.c | 63 ++++++++++++++ .../gcc.dg/gnu11-empty-init-warn-5.c | 8 ++ .../gcc.dg/gnu11-empty-init-warn-6.c | 8 ++ .../gcc.dg/gnu11-empty-init-warn-7.c | 8 ++ .../gcc.dg/gnu11-empty-init-warn-8.c | 8 ++ .../gcc.dg/gnu11-empty-init-warn-9.c | 55 ++++++++++++ 39 files changed, 937 insertions(+), 25 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-1.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-10.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-11.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-12.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-13.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-14.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-15.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-16.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-17.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-2.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-3.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-4.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-5.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-6.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-7.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-8.c create mode 100644 gcc/testsuite/gcc.dg/c23-empty-init-warn-9.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-1.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-10.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-11.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-12.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-13.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-14.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-15.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-16.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-17.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-2.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-3.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-4.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-5.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-6.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-7.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-8.c create mode 100644 gcc/testsuite/gcc.dg/gnu11-empty-init-warn-9.c -- 2.43.0