This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Do not sanitize in lower_omp_target context (PR, sanitizer/78815).
- From: Martin Liška <mliska at suse dot cz>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 5 Jan 2017 09:42:54 +0100
- Subject: Re: [PATCH] Do not sanitize in lower_omp_target context (PR, sanitizer/78815).
- Authentication-results: sourceware.org; auth=none
- References: <cfcd9d95-8e06-48be-3469-2bfa71310ef1@suse.cz> <520dceec-1ca4-c0e1-0466-bbc0b1d4e9a7@suse.cz> <20170104093127.GG21933@tucnak>
On 01/04/2017 10:31 AM, Jakub Jelinek wrote:
> On Wed, Jan 04, 2017 at 10:19:28AM +0100, Martin Liška wrote:
>> PING^1
>>
>> On 12/16/2016 01:04 PM, Martin Liška wrote:
>>> Currently, use-after-scope relies on fact that entry point of gimplify_decl_expr
>>> is gimplify_function_tree. Fixed by checking if asan_poisoned_variables is non-null.
>>>
>>> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>>>
>>> Ready to be installed?
>
> Looking at asan_poisoned_variables, my preference would be to guard:
> asan_poisoned_variables = new hash_set<tree> ();
> with
> if (asan_sanitize_use_after_scope ()
> && !asan_no_sanitize_address_p ())
> the delete asan_poisoned_variables; with if (asan_poisoned_variables)
> and all the poisoning stuff in the gimplifier also with if
> (asan_poisoned_variables) and no need to repeat there the asan_sanitize_use_after_scope
> () and !asan_no_sanitize_address_p () tests.
> if (asan_poisoned_variables != NULL
> && asan_poisoned_variables->contains (t))
> is already fine,
> if (asan_sanitize_use_after_scope ()
> && !asan_no_sanitize_address_p ()
> && !is_vla
> && TREE_ADDRESSABLE (decl)
> && !TREE_STATIC (decl)
> && !DECL_HAS_VALUE_EXPR_P (decl)
> && dbg_cnt (asan_use_after_scope))
> should replace the first 2 conditions with asan_poisoned_variables,
> if (asan_sanitize_use_after_scope ()
> && asan_used_labels != NULL
> && asan_used_labels->contains (label))
> asan_poison_variables (asan_poisoned_variables, false, pre_p);
> should replace asan_sanitize_use_after_scope () with
> asan_poisoned_variables. IMHO no need to add comments, especially not one
> mentioning omp lowering - the gimplifier is called from lots of various
> places.
>
> Jakub
>
I like your approach, I'm sending updated patch which bootstraps and survives
regression tests.
Ready to be installed?
Martin
>From 42887cf5fe7d94709ee5356fb6534c7a4fc26bff Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Wed, 4 Jan 2017 16:43:49 +0100
Subject: [PATCH] Do not sanitize in an abnormal context (PR sanitizer/78815).
gcc/ChangeLog:
2017-01-04 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.
---
gcc/gimplify.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 14e79b4b3f3..e1e9ce9e903 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. */
--
2.11.0