Support nested functions (PR sanitizer/78541).
authorMartin Liska <mliska@suse.cz>
Wed, 30 Nov 2016 09:26:51 +0000 (10:26 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Wed, 30 Nov 2016 09:26:51 +0000 (09:26 +0000)
PR sanitizer/78541
* gcc.dg/asan/pr78541-2.c: New test.
* gcc.dg/asan/pr78541.c: New test.
PR sanitizer/78541
* asan.c (asan_expand_mark_ifn): Properly
select a VAR_DECL from FRAME.* component reference.

From-SVN: r243003

gcc/ChangeLog
gcc/asan.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/asan/pr78541-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/asan/pr78541.c [new file with mode: 0644]

index 8f8e450f8f06c857175771e90741c8bb1d1f2188..c68d3c95005ef9df50b5d9ccd643e419e000035b 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-30  Martin Liska  <mliska@suse.cz>
+
+       PR sanitizer/78541
+       * asan.c (asan_expand_mark_ifn): Properly
+       select a VAR_DECL from FRAME.* component reference.
+
 2016-11-30  Segher Boessenkool  <segher@kernel.crashing.org>
 
        PR rtl-optimization/78583
index 6e93ea3aba5595d1395823465291e1eb995bb78c..cb5d6158e598f2452a1bbae85db1adc1b7542880 100644 (file)
@@ -2713,6 +2713,12 @@ asan_expand_mark_ifn (gimple_stmt_iterator *iter)
   tree base = gimple_call_arg (g, 1);
   gcc_checking_assert (TREE_CODE (base) == ADDR_EXPR);
   tree decl = TREE_OPERAND (base, 0);
+
+  /* For a nested function, we can have: ASAN_MARK (2, &FRAME.2.fp_input, 4) */
+  if (TREE_CODE (decl) == COMPONENT_REF
+      && DECL_NONLOCAL_FRAME (TREE_OPERAND (decl, 0)))
+    decl = TREE_OPERAND (decl, 0);
+
   gcc_checking_assert (TREE_CODE (decl) == VAR_DECL);
   if (asan_handled_variables == NULL)
     asan_handled_variables = new hash_set<tree> (16);
index a79a4a8a94a0cabc79bd9f968eb095fedf7a706a..3074e6d05a584cd35db95cfde1a8b5cd968d7b8e 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-30  Martin Liska  <mliska@suse.cz>
+
+       PR sanitizer/78541
+       * gcc.dg/asan/pr78541-2.c: New test.
+       * gcc.dg/asan/pr78541.c: New test.
+
 2016-11-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/78586
diff --git a/gcc/testsuite/gcc.dg/asan/pr78541-2.c b/gcc/testsuite/gcc.dg/asan/pr78541-2.c
new file mode 100644 (file)
index 0000000..44be19c
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR sanitizer/78560 */
+/* { dg-do compile } */
+
+void __quadmath_mpn_extract_flt128 (long *fp_input);
+
+int fn1 ()
+{
+  long fp_input[1];
+  int hack_digit () { __quadmath_mpn_extract_flt128 (fp_input); }
+}
diff --git a/gcc/testsuite/gcc.dg/asan/pr78541.c b/gcc/testsuite/gcc.dg/asan/pr78541.c
new file mode 100644 (file)
index 0000000..fb02082
--- /dev/null
@@ -0,0 +1,25 @@
+// PR sanitizer/78560
+// { dg-do run }
+// { dg-shouldfail "asan" }
+
+void foo (double a, double b)
+{
+  double *ptr;
+    {
+      double x = a + b;
+      ptr = &x;
+    }
+ double square () { __builtin_printf ("", *ptr); }
+
+ square ();
+}
+
+int main()
+{
+  foo (1.2f, 2.3f);
+  return 0;
+}
+
+// { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
+// { dg-output "READ of size.*" }
+// { dg-output ".*'x' <== Memory access at offset \[0-9\]* is inside this variable.*" }