ASAN: clear DECL_NOT_GIMPLE_REG_P.
authorMartin Liska <mliska@suse.cz>
Tue, 12 May 2020 08:23:09 +0000 (10:23 +0200)
committerMartin Liska <mliska@suse.cz>
Tue, 12 May 2020 08:23:09 +0000 (10:23 +0200)
PR sanitizer/95033
PR sanitizer/95051
* sanopt.c (sanitize_rewrite_addressable_params):
Clear DECL_NOT_GIMPLE_REG_P for argument.
PR sanitizer/95033
PR sanitizer/95051
* g++.dg/asan/function-argument-4.C: New test.
* gcc.dg/asan/pr95033.c: New test.
* gcc.dg/asan/pr95051.c: New test.

gcc/ChangeLog
gcc/sanopt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/asan/function-argument-4.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/asan/pr95033.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/asan/pr95051.c [new file with mode: 0644]

index 751b71d..72b56ad 100644 (file)
@@ -1,3 +1,10 @@
+2020-05-12  Martin Liska  <mliska@suse.cz>
+
+       PR sanitizer/95033
+       PR sanitizer/95051
+       * sanopt.c (sanitize_rewrite_addressable_params):
+       Clear DECL_NOT_GIMPLE_REG_P for argument.
+
 2020-05-12  Richard Sandiford  <richard.sandiford@arm.com>
 
        PR tree-optimization/94980
index 86180e3..6c3bce9 100644 (file)
@@ -1158,6 +1158,7 @@ sanitize_rewrite_addressable_params (function *fun)
          && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
        {
          TREE_ADDRESSABLE (arg) = 0;
+         DECL_NOT_GIMPLE_REG_P (arg) = 0;
          /* The parameter is no longer addressable.  */
          has_any_addressable_param = true;
 
index 0c8a73a..05952ac 100644 (file)
@@ -1,3 +1,11 @@
+2020-05-12  Martin Liska  <mliska@suse.cz>
+
+       PR sanitizer/95033
+       PR sanitizer/95051
+       * g++.dg/asan/function-argument-4.C: New test.
+       * gcc.dg/asan/pr95033.c: New test.
+       * gcc.dg/asan/pr95051.c: New test.
+
 2020-05-12  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/95063
diff --git a/gcc/testsuite/g++.dg/asan/function-argument-4.C b/gcc/testsuite/g++.dg/asan/function-argument-4.C
new file mode 100644 (file)
index 0000000..cec1f1d
--- /dev/null
@@ -0,0 +1,26 @@
+// { dg-do run }
+// { dg-shouldfail "asan" }
+
+#include <complex.h>
+
+static __attribute__ ((noinline)) long double
+goo (long double _Complex *a)
+{
+  return crealf(*(volatile _Complex long double *)a);
+}
+
+__attribute__ ((noinline)) float
+foo (float _Complex arg)
+{
+  return goo ((long double _Complex *)&arg);
+}
+
+int
+main ()
+{
+  return foo (3 + 2 * I);
+}
+
+// { dg-output "ERROR: AddressSanitizer: stack-buffer-overflow on address.*(\n|\r\n|\r)" }
+// { dg-output "READ of size \[0-9\]* at.*" }
+// { dg-output ".*'arg' \\(line 13\\) <== Memory access at offset \[0-9\]* partially overflows this variable.*" }
diff --git a/gcc/testsuite/gcc.dg/asan/pr95033.c b/gcc/testsuite/gcc.dg/asan/pr95033.c
new file mode 100644 (file)
index 0000000..1228b7e
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR sanitizer/95033 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=address" } */
+
+struct a
+{
+  int b;
+};
+
+struct a c(_Complex d)
+{
+  return *(struct a *)&d;
+}
diff --git a/gcc/testsuite/gcc.dg/asan/pr95051.c b/gcc/testsuite/gcc.dg/asan/pr95051.c
new file mode 100644 (file)
index 0000000..ec41a83
--- /dev/null
@@ -0,0 +1,22 @@
+/* PR sanitizer/95051 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=kernel-address --param=asan-stack=1 -O2" } */
+
+struct a {
+  struct {
+    struct {
+      int b;
+    } c;
+  };
+};
+struct d {
+  struct {
+    int e;
+  } f;
+}
+
+g(int h) {
+  struct a *i;
+  struct d *j = (struct d*)&h;
+  i->c.b = j->f.e;
+}