Commit 94087e88 by Jakub Jelinek

re PR sanitizer/77396 (address sanitizer crashes if all static global variables are optimized)

	PR sanitizer/77396
	* sanopt.c: Include gimple-ssa.h, tree-phinodes.h and ssa-iterators.h.
	(sanopt_optimize_walker): Optimize away
	__asan_before_dynamic_init (...) followed by
	__asan_after_dynamic_init () without intervening memory loads/stores.
	* ipa-pure-const.c (special_builtin_state): Handle
	BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT and
	BUILT_IN_ASAN_AFTER_DYNAMIC_INIT.

	* decl2.c (do_static_initialization_or_destruction): Only
	call asan_dynamic_init_call if INITP is true.

	* g++.dg/asan/pr77396.C: New test.

From-SVN: r239961
parent af711c23
2016-09-02 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/77396
* sanopt.c: Include gimple-ssa.h, tree-phinodes.h and ssa-iterators.h.
(sanopt_optimize_walker): Optimize away
__asan_before_dynamic_init (...) followed by
__asan_after_dynamic_init () without intervening memory loads/stores.
* ipa-pure-const.c (special_builtin_state): Handle
BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT and
BUILT_IN_ASAN_AFTER_DYNAMIC_INIT.
2016-09-02 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> 2016-09-02 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
* cfg.c (free_original_copy_tables): Replace second assignment of * cfg.c (free_original_copy_tables): Replace second assignment of
...@@ -28,7 +39,7 @@ ...@@ -28,7 +39,7 @@
* ipa-cp.c (ipcp_store_bits_results): Change option name from * ipa-cp.c (ipcp_store_bits_results): Change option name from
-fipa-cp-bit to -fipa-bit-cp. -fipa-cp-bit to -fipa-bit-cp.
2016-09-01 Martin Sebor <msebor@redhat.com> 2016-09-01 Martin Sebor <msebor@redhat.com>
PR tree-optimization/71831 PR tree-optimization/71831
* tree-object-size.h: Return bool instead of the size and add * tree-object-size.h: Return bool instead of the size and add
...@@ -45,7 +56,7 @@ ...@@ -45,7 +56,7 @@
* doc/extend.texi (Object Size Checking): Update. * doc/extend.texi (Object Size Checking): Update.
* ubsan.c (instrument_object_size): Adjust. * ubsan.c (instrument_object_size): Adjust.
2016-09-01 Martin Sebor <msebor@redhat.com> 2016-09-01 Martin Sebor <msebor@redhat.com>
* genmatch.c (parser::parse_expr): Increase buffer size to guarantee * genmatch.c (parser::parse_expr): Increase buffer size to guarantee
it fits the output of the formatted function regardless of its it fits the output of the formatted function regardless of its
...@@ -3487,11 +3498,11 @@ ...@@ -3487,11 +3498,11 @@
* config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin): * config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin):
Reformat two multi-line strings. Reformat two multi-line strings.
2016-07-22 Martin Sebor <msebor@redhat.com> 2016-07-22 Martin Sebor <msebor@redhat.com>
* doc/extend.texi (Compound Literals): Add '@' missed in last commit. * doc/extend.texi (Compound Literals): Add '@' missed in last commit.
2016-07-22 Martin Sebor <msebor@redhat.com> 2016-07-22 Martin Sebor <msebor@redhat.com>
PR c/71560 PR c/71560
* doc/extend.texi (Compound Literals): Correct and clarify. * doc/extend.texi (Compound Literals): Correct and clarify.
......
2016-09-01 Martin Sebor <msebor@redhat.com> 2016-09-02 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/77396
* decl2.c (do_static_initialization_or_destruction): Only
call asan_dynamic_init_call if INITP is true.
2016-09-01 Martin Sebor <msebor@redhat.com>
* mangle.c: Increase buffer size to guarantee it fits the output * mangle.c: Increase buffer size to guarantee it fits the output
of the formatted function regardless of its arguments. of the formatted function regardless of its arguments.
...@@ -299,7 +305,7 @@ ...@@ -299,7 +305,7 @@
* cp-gimplify.c (cp_fully_fold): Only maybe_constant_value in * cp-gimplify.c (cp_fully_fold): Only maybe_constant_value in
C++11 and up. C++11 and up.
2016-07-30 Martin Sebor <msebor@redhat.com> 2016-07-30 Martin Sebor <msebor@redhat.com>
PR c++/60760 PR c++/60760
PR c++/71091 PR c++/71091
......
...@@ -3861,7 +3861,7 @@ do_static_initialization_or_destruction (tree vars, bool initp) ...@@ -3861,7 +3861,7 @@ do_static_initialization_or_destruction (tree vars, bool initp)
in other compilation units, or at least those that haven't been in other compilation units, or at least those that haven't been
initialized yet. Variables that need dynamic construction in initialized yet. Variables that need dynamic construction in
the current compilation unit are kept accessible. */ the current compilation unit are kept accessible. */
if (flag_sanitize & SANITIZE_ADDRESS) if (initp && (flag_sanitize & SANITIZE_ADDRESS))
finish_expr_stmt (asan_dynamic_init_call (/*after_p=*/false)); finish_expr_stmt (asan_dynamic_init_call (/*after_p=*/false));
node = vars; node = vars;
...@@ -3914,7 +3914,7 @@ do_static_initialization_or_destruction (tree vars, bool initp) ...@@ -3914,7 +3914,7 @@ do_static_initialization_or_destruction (tree vars, bool initp)
/* Revert what __asan_before_dynamic_init did by calling /* Revert what __asan_before_dynamic_init did by calling
__asan_after_dynamic_init. */ __asan_after_dynamic_init. */
if (flag_sanitize & SANITIZE_ADDRESS) if (initp && (flag_sanitize & SANITIZE_ADDRESS))
finish_expr_stmt (asan_dynamic_init_call (/*after_p=*/true)); finish_expr_stmt (asan_dynamic_init_call (/*after_p=*/true));
/* Finish up the init/destruct if-stmt body. */ /* Finish up the init/destruct if-stmt body. */
......
...@@ -508,6 +508,8 @@ special_builtin_state (enum pure_const_state_e *state, bool *looping, ...@@ -508,6 +508,8 @@ special_builtin_state (enum pure_const_state_e *state, bool *looping,
case BUILT_IN_FRAME_ADDRESS: case BUILT_IN_FRAME_ADDRESS:
case BUILT_IN_APPLY: case BUILT_IN_APPLY:
case BUILT_IN_APPLY_ARGS: case BUILT_IN_APPLY_ARGS:
case BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT:
case BUILT_IN_ASAN_AFTER_DYNAMIC_INIT:
*looping = false; *looping = false;
*state = IPA_CONST; *state = IPA_CONST;
return true; return true;
......
...@@ -33,6 +33,9 @@ along with GCC; see the file COPYING3. If not see ...@@ -33,6 +33,9 @@ along with GCC; see the file COPYING3. If not see
#include "ubsan.h" #include "ubsan.h"
#include "params.h" #include "params.h"
#include "tree-hash-traits.h" #include "tree-hash-traits.h"
#include "gimple-ssa.h"
#include "tree-phinodes.h"
#include "ssa-iterators.h"
/* This is used to carry information about basic blocks. It is /* This is used to carry information about basic blocks. It is
...@@ -538,6 +541,28 @@ sanopt_optimize_walker (basic_block bb, struct sanopt_ctx *ctx) ...@@ -538,6 +541,28 @@ sanopt_optimize_walker (basic_block bb, struct sanopt_ctx *ctx)
if (asan_check_optimize && !nonfreeing_call_p (stmt)) if (asan_check_optimize && !nonfreeing_call_p (stmt))
info->freeing_call_events++; info->freeing_call_events++;
/* If __asan_before_dynamic_init ("module"); is followed by
__asan_after_dynamic_init (); without intervening memory loads/stores,
there is nothing to guard, so optimize both away. */
if (asan_check_optimize
&& gimple_call_builtin_p (stmt, BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT))
{
use_operand_p use;
gimple *use_stmt;
if (single_imm_use (gimple_vdef (stmt), &use, &use_stmt))
{
if (is_gimple_call (use_stmt)
&& gimple_call_builtin_p (use_stmt,
BUILT_IN_ASAN_AFTER_DYNAMIC_INIT))
{
unlink_stmt_vdef (use_stmt);
gimple_stmt_iterator gsi2 = gsi_for_stmt (use_stmt);
gsi_remove (&gsi2, true);
remove = true;
}
}
}
if (gimple_call_internal_p (stmt)) if (gimple_call_internal_p (stmt))
switch (gimple_call_internal_fn (stmt)) switch (gimple_call_internal_fn (stmt))
{ {
......
2016-09-01 Martin Sebor <msebor@redhat.com> 2016-09-02 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/77396
* g++.dg/asan/pr77396.C: New test.
2016-09-01 Martin Sebor <msebor@redhat.com>
PR tree-optimization/71831 PR tree-optimization/71831
* gcc.dg/builtin-object-size-16.c: New test. * gcc.dg/builtin-object-size-16.c: New test.
...@@ -1105,7 +1110,7 @@ ...@@ -1105,7 +1110,7 @@
* gcc.dg/tree-ssa/vrp105.c: New test. * gcc.dg/tree-ssa/vrp105.c: New test.
* gcc.dg/tree-ssa/vrp106.c: New test. * gcc.dg/tree-ssa/vrp106.c: New test.
2016-08-05 Martin Sebor <msebor@redhat.com> 2016-08-05 Martin Sebor <msebor@redhat.com>
* g++.dg/cpp0x/constexpr-cast.C: Avoid assuming (void*)1 is spelled * g++.dg/cpp0x/constexpr-cast.C: Avoid assuming (void*)1 is spelled
1ul in diagnostics. Remove hyphen from "constant-expression." 1ul in diagnostics. Remove hyphen from "constant-expression."
...@@ -1339,7 +1344,7 @@ ...@@ -1339,7 +1344,7 @@
PR fortran/68566 PR fortran/68566
* gfortran.dg/pr68566.f90: new test. * gfortran.dg/pr68566.f90: new test.
2016-07-30 Martin Sebor <msebor@redhat.com> 2016-07-30 Martin Sebor <msebor@redhat.com>
PR c++/60760 PR c++/60760
PR c++/71091 PR c++/71091
...@@ -1687,7 +1692,7 @@ ...@@ -1687,7 +1692,7 @@
* gfortran.dg/c_sizeof_6.f90: here. Test for error. * gfortran.dg/c_sizeof_6.f90: here. Test for error.
* gfortran.dg/pr71935.f90: New test. * gfortran.dg/pr71935.f90: New test.
2016-07-22 Martin Sebor <msebor@redhat.com> 2016-07-22 Martin Sebor <msebor@redhat.com>
PR c++/71675 PR c++/71675
* g++.dg/ext/atomic-3.C: New test. * g++.dg/ext/atomic-3.C: New test.
...@@ -3340,7 +3345,7 @@ ...@@ -3340,7 +3345,7 @@
PR target/71103 PR target/71103
* gcc.target/avr/torture/pr71103-2.c: New test. * gcc.target/avr/torture/pr71103-2.c: New test.
2016-06-19 Martin Sebor <msebor@redhat.com> 2016-06-19 Martin Sebor <msebor@redhat.com>
PR c/69507 PR c/69507
* gcc.dg/alignof.c: New test. * gcc.dg/alignof.c: New test.
......
// PR sanitizer/77396
// { dg-do run }
// { dg-set-target-env-var ASAN_OPTIONS "check_initialization_order=true" }
static int a = 0;
static int b = a;
int
main ()
{
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment