Skip to content
Snippets Groups Projects
  • qing zhao's avatar
    a25e0b5e
    Add -ftrivial-auto-var-init option and uninitialized variable attribute. · a25e0b5e
    qing zhao authored
    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.
    a25e0b5e
    History
    Add -ftrivial-auto-var-init option and uninitialized variable attribute.
    qing zhao authored
    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.