aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2017-10-19 09:50:48 +0200
committerMartin Liska <marxin@gcc.gnu.org>2017-10-19 07:50:48 +0000
commit36208e6037b452fb2e7bdb7faf514dd98e531e26 (patch)
tree87ee9450aa3646da62f0fd75175d108e225a9a2b /gcc
parentcd30a0b8fec5e27d43349e4d48e166f1ccde6306 (diff)
downloadgcc-36208e6037b452fb2e7bdb7faf514dd98e531e26.zip
gcc-36208e6037b452fb2e7bdb7faf514dd98e531e26.tar.gz
gcc-36208e6037b452fb2e7bdb7faf514dd98e531e26.tar.bz2
Do not instrument use-after-scope for vars with large alignment (PR sanitizer/82517).
2017-10-19 Martin Liska <mliska@suse.cz> PR sanitizer/82517 * gimplify.c (gimplify_decl_expr): Do not instrument variables that have a large alignment. (gimplify_target_expr): Likewise. 2017-10-19 Martin Liska <mliska@suse.cz> PR sanitizer/82517 * gcc.dg/asan/pr82517.c: New test. From-SVN: r253879
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimplify.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/asan/pr82517.c43
4 files changed, 59 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a139a82..e60a49f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2017-10-19 Martin Liska <mliska@suse.cz>
+
+ PR sanitizer/82517
+ * gimplify.c (gimplify_decl_expr): Do not instrument variables
+ that have a large alignment.
+ (gimplify_target_expr): Likewise.
+
2017-10-18 Segher Boessenkool <segher@kernel.crashing.org>
PR rtl-optimization/82602
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index c3fd6ac..19411c9 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -1656,6 +1656,7 @@ gimplify_decl_expr (tree *stmt_p, gimple_seq *seq_p)
&& TREE_ADDRESSABLE (decl)
&& !TREE_STATIC (decl)
&& !DECL_HAS_VALUE_EXPR_P (decl)
+ && DECL_ALIGN (decl) <= MAX_SUPPORTED_STACK_ALIGNMENT
&& dbg_cnt (asan_use_after_scope))
{
asan_poisoned_variables->add (decl);
@@ -6505,7 +6506,9 @@ gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
clobber = build2 (MODIFY_EXPR, TREE_TYPE (temp), temp, clobber);
gimple_push_cleanup (temp, clobber, false, pre_p, true);
}
- if (asan_poisoned_variables && dbg_cnt (asan_use_after_scope))
+ if (asan_poisoned_variables
+ && DECL_ALIGN (temp) <= MAX_SUPPORTED_STACK_ALIGNMENT
+ && dbg_cnt (asan_use_after_scope))
{
tree asan_cleanup = build_asan_poison_call_expr (temp);
if (asan_cleanup)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 39f2edd..a30186a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-10-19 Martin Liska <mliska@suse.cz>
+
+ PR sanitizer/82517
+ * gcc.dg/asan/pr82517.c: New test.
+
2017-10-19 Jakub Jelinek <jakub@redhat.com>
PR fortran/82568
diff --git a/gcc/testsuite/gcc.dg/asan/pr82517.c b/gcc/testsuite/gcc.dg/asan/pr82517.c
new file mode 100644
index 0000000..c7743ec
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/asan/pr82517.c
@@ -0,0 +1,43 @@
+/* PR sanitizer/82517. */
+
+static int *pp;
+
+void
+baz ()
+{
+ return;
+}
+
+void
+bar (int *p)
+{
+ *p = 1;
+}
+
+void
+foo (int a)
+{
+ if (a == 2)
+ {
+ lab:
+ baz ();
+ return;
+ }
+ if (a > 1)
+ {
+ int x __attribute__ ((aligned (256)));
+ pp = &x;
+ bar (&x);
+ if (!x)
+ goto lab;
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ foo (4);
+ foo (3);
+
+ return 0;
+}