]> git.ipfire.org Git - thirdparty/gcc.git/commit - gcc/tree-ssa-uninit.c
Add -ftrivial-auto-var-init option and uninitialized variable attribute.
authorqing zhao <qing.zhao@oracle.com>
Thu, 9 Sep 2021 22:44:49 +0000 (15:44 -0700)
committerqing zhao <qing.zhao@oracle.com>
Thu, 9 Sep 2021 22:44:49 +0000 (15:44 -0700)
commita25e0b5e6ac8a77a71c229e0a7b744603365b0e9
treee46dad7fa274dc376be2ccf4735b5333c5d34315
parent5fe0865ab788bdc387b284a3ad57e5a95a767b18
Add -ftrivial-auto-var-init option and uninitialized variable attribute.

Initialize automatic variables with either a pattern or with zeroes to increase
the security and predictability of a program by preventing uninitialized memory
disclosure and use.
GCC still considers an automatic variable that doesn't have an explicit
initializer as uninitialized, -Wuninitialized will still report warning messages
on such automatic variables.
With this option, GCC will also initialize any padding of automatic variables
that have structure or union types to zeroes.
You can control this behavior for a specific variable by using the variable
attribute "uninitialized" to control runtime overhead.

gcc/ChangeLog:

2021-09-09  qing zhao  <qing.zhao@oracle.com>

* builtins.c (expand_builtin_memset): Make external visible.
* builtins.h (expand_builtin_memset): Declare extern.
* common.opt (ftrivial-auto-var-init=): New option.
* doc/extend.texi: Document the uninitialized attribute.
* doc/invoke.texi: Document -ftrivial-auto-var-init.
* flag-types.h (enum auto_init_type): New enumerated type
auto_init_type.
* gimple-fold.c (clear_padding_type): Add one new parameter.
(clear_padding_union): Likewise.
(clear_padding_emit_loop): Likewise.
(clear_type_padding_in_mask): Likewise.
(gimple_fold_builtin_clear_padding): Handle this new parameter.
* gimplify.c (gimple_add_init_for_auto_var): New function.
(gimple_add_padding_init_for_auto_var): New function.
(is_var_need_auto_init): New function.
(gimplify_decl_expr): Add initialization to automatic variables per
users' requests.
(gimplify_call_expr): Add one new parameter for call to
__builtin_clear_padding.
(gimplify_init_constructor): Add padding initialization in the end.
* internal-fn.c (INIT_PATTERN_VALUE): New macro.
(expand_DEFERRED_INIT): New function.
* internal-fn.def (DEFERRED_INIT): New internal function.
* tree-cfg.c (verify_gimple_call): Verify calls to .DEFERRED_INIT.
* tree-sra.c (generate_subtree_deferred_init): New function.
(scan_function): Avoid setting cannot_scalarize_away_bitmap for
calls to .DEFERRED_INIT.
(sra_modify_deferred_init): New function.
(sra_modify_function_body): Handle calls to DEFERRED_INIT specially.
* tree-ssa-structalias.c (find_func_aliases_for_call): Likewise.
* tree-ssa-uninit.c (warn_uninit): Handle calls to DEFERRED_INIT
specially.
(check_defs): Likewise.
(warn_uninitialized_vars): Likewise.
* tree-ssa.c (ssa_undefined_value_p): Likewise.
* tree.c (build_common_builtin_nodes): Build tree node for
BUILT_IN_CLEAR_PADDING when needed.

gcc/c-family/ChangeLog:

2021-09-09  qing zhao  <qing.zhao@oracle.com>

* c-attribs.c (handle_uninitialized_attribute): New function.
(c_common_attribute_table): Add "uninitialized" attribute.

gcc/testsuite/ChangeLog:

2021-09-09  qing zhao  <qing.zhao@oracle.com>

* c-c++-common/auto-init-1.c: New test.
* c-c++-common/auto-init-10.c: New test.
* c-c++-common/auto-init-11.c: New test.
* c-c++-common/auto-init-12.c: New test.
* c-c++-common/auto-init-13.c: New test.
* c-c++-common/auto-init-14.c: New test.
* c-c++-common/auto-init-15.c: New test.
* c-c++-common/auto-init-16.c: New test.
* c-c++-common/auto-init-2.c: New test.
* c-c++-common/auto-init-3.c: New test.
* c-c++-common/auto-init-4.c: New test.
* c-c++-common/auto-init-5.c: New test.
* c-c++-common/auto-init-6.c: New test.
* c-c++-common/auto-init-7.c: New test.
* c-c++-common/auto-init-8.c: New test.
* c-c++-common/auto-init-9.c: New test.
* c-c++-common/auto-init-esra.c: New test.
* c-c++-common/auto-init-padding-1.c: New test.
* c-c++-common/auto-init-padding-2.c: New test.
* c-c++-common/auto-init-padding-3.c: New test.
* g++.dg/auto-init-uninit-pred-1_a.C: New test.
* g++.dg/auto-init-uninit-pred-2_a.C: New test.
* g++.dg/auto-init-uninit-pred-3_a.C: New test.
* g++.dg/auto-init-uninit-pred-4.C: New test.
* gcc.dg/auto-init-sra-1.c: New test.
* gcc.dg/auto-init-sra-2.c: New test.
* gcc.dg/auto-init-uninit-1.c: New test.
* gcc.dg/auto-init-uninit-12.c: New test.
* gcc.dg/auto-init-uninit-13.c: New test.
* gcc.dg/auto-init-uninit-14.c: New test.
* gcc.dg/auto-init-uninit-15.c: New test.
* gcc.dg/auto-init-uninit-16.c: New test.
* gcc.dg/auto-init-uninit-17.c: New test.
* gcc.dg/auto-init-uninit-18.c: New test.
* gcc.dg/auto-init-uninit-19.c: New test.
* gcc.dg/auto-init-uninit-2.c: New test.
* gcc.dg/auto-init-uninit-20.c: New test.
* gcc.dg/auto-init-uninit-21.c: New test.
* gcc.dg/auto-init-uninit-22.c: New test.
* gcc.dg/auto-init-uninit-23.c: New test.
* gcc.dg/auto-init-uninit-24.c: New test.
* gcc.dg/auto-init-uninit-25.c: New test.
* gcc.dg/auto-init-uninit-26.c: New test.
* gcc.dg/auto-init-uninit-3.c: New test.
* gcc.dg/auto-init-uninit-34.c: New test.
* gcc.dg/auto-init-uninit-36.c: New test.
* gcc.dg/auto-init-uninit-37.c: New test.
* gcc.dg/auto-init-uninit-4.c: New test.
* gcc.dg/auto-init-uninit-5.c: New test.
* gcc.dg/auto-init-uninit-6.c: New test.
* gcc.dg/auto-init-uninit-8.c: New test.
* gcc.dg/auto-init-uninit-9.c: New test.
* gcc.dg/auto-init-uninit-A.c: New test.
* gcc.dg/auto-init-uninit-B.c: New test.
* gcc.dg/auto-init-uninit-C.c: New test.
* gcc.dg/auto-init-uninit-H.c: New test.
* gcc.dg/auto-init-uninit-I.c: New test.
* gcc.target/aarch64/auto-init-1.c: New test.
* gcc.target/aarch64/auto-init-2.c: New test.
* gcc.target/aarch64/auto-init-3.c: New test.
* gcc.target/aarch64/auto-init-4.c: New test.
* gcc.target/aarch64/auto-init-5.c: New test.
* gcc.target/aarch64/auto-init-6.c: New test.
* gcc.target/aarch64/auto-init-7.c: New test.
* gcc.target/aarch64/auto-init-8.c: New test.
* gcc.target/aarch64/auto-init-padding-1.c: New test.
* gcc.target/aarch64/auto-init-padding-10.c: New test.
* gcc.target/aarch64/auto-init-padding-11.c: New test.
* gcc.target/aarch64/auto-init-padding-12.c: New test.
* gcc.target/aarch64/auto-init-padding-2.c: New test.
* gcc.target/aarch64/auto-init-padding-3.c: New test.
* gcc.target/aarch64/auto-init-padding-4.c: New test.
* gcc.target/aarch64/auto-init-padding-5.c: New test.
* gcc.target/aarch64/auto-init-padding-6.c: New test.
* gcc.target/aarch64/auto-init-padding-7.c: New test.
* gcc.target/aarch64/auto-init-padding-8.c: New test.
* gcc.target/aarch64/auto-init-padding-9.c: New test.
* gcc.target/i386/auto-init-1.c: New test.
* gcc.target/i386/auto-init-2.c: New test.
* gcc.target/i386/auto-init-21.c: New test.
* gcc.target/i386/auto-init-22.c: New test.
* gcc.target/i386/auto-init-23.c: New test.
* gcc.target/i386/auto-init-24.c: New test.
* gcc.target/i386/auto-init-3.c: New test.
* gcc.target/i386/auto-init-4.c: New test.
* gcc.target/i386/auto-init-5.c: New test.
* gcc.target/i386/auto-init-6.c: New test.
* gcc.target/i386/auto-init-7.c: New test.
* gcc.target/i386/auto-init-8.c: New test.
* gcc.target/i386/auto-init-padding-1.c: New test.
* gcc.target/i386/auto-init-padding-10.c: New test.
* gcc.target/i386/auto-init-padding-11.c: New test.
* gcc.target/i386/auto-init-padding-12.c: New test.
* gcc.target/i386/auto-init-padding-2.c: New test.
* gcc.target/i386/auto-init-padding-3.c: New test.
* gcc.target/i386/auto-init-padding-4.c: New test.
* gcc.target/i386/auto-init-padding-5.c: New test.
* gcc.target/i386/auto-init-padding-6.c: New test.
* gcc.target/i386/auto-init-padding-7.c: New test.
* gcc.target/i386/auto-init-padding-8.c: New test.
* gcc.target/i386/auto-init-padding-9.c: New test.
118 files changed:
gcc/builtins.c
gcc/builtins.h
gcc/c-family/c-attribs.c
gcc/common.opt
gcc/doc/extend.texi
gcc/doc/invoke.texi
gcc/flag-types.h
gcc/gimple-fold.c
gcc/gimplify.c
gcc/internal-fn.c
gcc/internal-fn.def
gcc/testsuite/c-c++-common/auto-init-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-10.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-11.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-12.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-13.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-14.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-15.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-16.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-3.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-4.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-5.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-6.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-7.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-8.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-9.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-esra.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-padding-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-padding-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/auto-init-padding-3.c [new file with mode: 0644]
gcc/testsuite/g++.dg/auto-init-uninit-pred-1_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/auto-init-uninit-pred-2_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/auto-init-uninit-pred-3_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/auto-init-uninit-pred-4.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-sra-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-sra-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-12.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-13.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-14.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-15.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-16.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-17.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-18.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-19.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-20.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-21.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-22.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-23.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-24.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-25.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-26.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-34.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-36.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-37.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-5.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-6.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-8.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-9.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-A.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-B.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-C.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-H.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/auto-init-uninit-I.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-padding-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-padding-10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-padding-11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-padding-12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-padding-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-padding-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-padding-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-padding-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-padding-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-padding-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-padding-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/auto-init-padding-9.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-21.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-22.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-23.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-24.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/auto-init-padding-9.c [new file with mode: 0644]
gcc/tree-cfg.c
gcc/tree-sra.c
gcc/tree-ssa-structalias.c
gcc/tree-ssa-uninit.c
gcc/tree-ssa.c
gcc/tree.c