diff options
author | Martin Liska <mliska@suse.cz> | 2017-01-05 10:16:50 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2017-01-05 09:16:50 +0000 |
commit | 6ff92497174e84271f71d1a1ede8a0ec513ee6a7 (patch) | |
tree | 35d4b9263534521db1a3b4659dbab8a4d9d370df /gcc/gimplify.c | |
parent | 6438c2f40fb3c678fb37e7e57f8c93aad2ecaae1 (diff) | |
download | gcc-6ff92497174e84271f71d1a1ede8a0ec513ee6a7.zip gcc-6ff92497174e84271f71d1a1ede8a0ec513ee6a7.tar.gz gcc-6ff92497174e84271f71d1a1ede8a0ec513ee6a7.tar.bz2 |
Do not sanitize in an abnormal context (PR sanitizer/78815).
2017-01-05 Martin Liska <mliska@suse.cz>
PR sanitizer/78815
* gimplify.c (gimplify_decl_expr): Compare to
asan_poisoned_variables instread of checking flags.
(gimplify_target_expr): Likewise.
(gimplify_expr): Likewise.
(gimplify_function_tree): Conditionally initialize
asan_poisoned_variables.
From-SVN: r244095
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 14e79b4..e1e9ce9 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1620,8 +1620,7 @@ gimplify_decl_expr (tree *stmt_p, gimple_seq *seq_p) is_vla = true; } - if (asan_sanitize_use_after_scope () - && !asan_no_sanitize_address_p () + if (asan_poisoned_variables && !is_vla && TREE_ADDRESSABLE (decl) && !TREE_STATIC (decl) @@ -6413,8 +6412,7 @@ gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) else cleanup = clobber; } - if (asan_sanitize_use_after_scope () - && dbg_cnt (asan_use_after_scope)) + if (asan_poisoned_variables && dbg_cnt (asan_use_after_scope)) { tree asan_cleanup = build_asan_poison_call_expr (temp); if (asan_cleanup) @@ -11426,7 +11424,7 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, /* If the label is used in a goto statement, or address of the label is taken, we need to unpoison all variables that were seen so far. Doing so would prevent us from reporting a false positives. */ - if (asan_sanitize_use_after_scope () + if (asan_poisoned_variables && asan_used_labels != NULL && asan_used_labels->contains (label)) asan_poison_variables (asan_poisoned_variables, false, pre_p); @@ -12531,10 +12529,14 @@ gimplify_function_tree (tree fndecl) && !needs_to_live_in_memory (ret)) DECL_GIMPLE_REG_P (ret) = 1; - asan_poisoned_variables = new hash_set<tree> (); + if (asan_sanitize_use_after_scope () && !asan_no_sanitize_address_p ()) + asan_poisoned_variables = new hash_set<tree> (); bind = gimplify_body (fndecl, true); - delete asan_poisoned_variables; - asan_poisoned_variables = NULL; + if (asan_poisoned_variables) + { + delete asan_poisoned_variables; + asan_poisoned_variables = NULL; + } /* The tree body of the function is no longer needed, replace it with the new GIMPLE body. */ |