From d838c2d5a8b1844c7c78596b9689339ec60731f3 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 28 Mar 2018 16:45:21 +0200 Subject: [PATCH] Fix wrong use-after-scope sanitization for omp variable (PR sanitizer/85081). 2018-03-28 Jakub Jelinek Martin Liska PR sanitizer/85081 * gimplify.c (asan_poison_variable): Don't do the check for gimplify_omp_ctxp here. (gimplify_decl_expr): Do it here. (gimplify_target_expr): Likewise. 2018-03-28 Jakub Jelinek Martin Liska PR sanitizer/85081 * g++.dg/asan/pr85081.C: New test. Co-Authored-By: Martin Liska From-SVN: r258924 --- gcc/ChangeLog | 9 +++++++++ gcc/gimplify.c | 10 ++++------ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/asan/pr85081.C | 20 ++++++++++++++++++++ 4 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/asan/pr85081.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 33f78bc91ba..7742da1f89b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2018-03-28 Jakub Jelinek + Martin Liska + + PR sanitizer/85081 + * gimplify.c (asan_poison_variable): Don't do the check for + gimplify_omp_ctxp here. + (gimplify_decl_expr): Do it here. + (gimplify_target_expr): Likewise. + 2018-03-28 Martin Liska PR target/84988 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 115f80bef9b..c32869b4c59 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1168,10 +1168,6 @@ static void asan_poison_variable (tree decl, bool poison, gimple_stmt_iterator *it, bool before) { - /* When within an OMP context, do not emit ASAN_MARK internal fns. */ - if (gimplify_omp_ctxp) - return; - tree unit_size = DECL_SIZE_UNIT (decl); tree base = build_fold_addr_expr (decl); @@ -1689,7 +1685,8 @@ gimplify_decl_expr (tree *stmt_p, gimple_seq *seq_p) && !TREE_STATIC (decl) && !DECL_HAS_VALUE_EXPR_P (decl) && DECL_ALIGN (decl) <= MAX_SUPPORTED_STACK_ALIGNMENT - && dbg_cnt (asan_use_after_scope)) + && dbg_cnt (asan_use_after_scope) + && !gimplify_omp_ctxp) { asan_poisoned_variables->add (decl); asan_poison_variable (decl, false, seq_p); @@ -6614,7 +6611,8 @@ gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) } if (asan_poisoned_variables && DECL_ALIGN (temp) <= MAX_SUPPORTED_STACK_ALIGNMENT - && dbg_cnt (asan_use_after_scope)) + && dbg_cnt (asan_use_after_scope) + && !gimplify_omp_ctxp) { tree asan_cleanup = build_asan_poison_call_expr (temp); if (asan_cleanup) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0fea4189860..fc1d5d078ed 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-03-28 Jakub Jelinek + Martin Liska + + PR sanitizer/85081 + * g++.dg/asan/pr85081.C: New test. + 2018-03-28 Alexandre Oliva PR c++/84789 diff --git a/gcc/testsuite/g++.dg/asan/pr85081.C b/gcc/testsuite/g++.dg/asan/pr85081.C new file mode 100644 index 00000000000..d7dec311450 --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/pr85081.C @@ -0,0 +1,20 @@ +/* PR sanitizer/85081 */ +/* { dg-do run } */ +/* { dg-options "-fopenmp-simd" } */ +/* { dg-require-effective-target fopenmp } */ + +inline const int& max(const int& a, const int& b) +{ + return a < b ? b : a; +} + +int main() +{ + #pragma omp simd + for ( int i = 0; i < 20; ++i ) + { + const int j = max(i, 1); + } + + return 0; +} -- 2.30.2