ASAN: emit line information of stack variables.
authorMartin Liska <mliska@suse.cz>
Tue, 9 Oct 2018 08:34:52 +0000 (10:34 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Tue, 9 Oct 2018 08:34:52 +0000 (08:34 +0000)
2018-10-09  Martin Liska  <mliska@suse.cz>

* asan.c (asan_emit_stack_protection): If a stack variable
is located in a same file as current function, then emit
line info into variable definition string.
2018-10-09  Martin Liska  <mliska@suse.cz>

* c-c++-common/asan/pr64820.c: Add line number to scanned
pattern.
* c-c++-common/asan/use-after-return-1.c: Likewise.
* g++.dg/asan/function-argument-1.C (main): Likewise.
* g++.dg/asan/function-argument-2.C (main): Likewise.
* g++.dg/asan/function-argument-3.C (main): Likewise.
* g++.dg/asan/use-after-scope-1.C (main): Likewise.
* g++.dg/asan/use-after-scope-2.C (main): Likewise.
* g++.dg/asan/use-after-scope-types-1.C (main): Likewise.
* g++.dg/asan/use-after-scope-types-2.C (main): Likewise.
* g++.dg/asan/use-after-scope-types-3.C (main): Likewise.
* g++.dg/asan/use-after-scope-types-4.C (main): Likewise.
* g++.dg/asan/use-after-scope-types-5.C (main): Likewise.
* gcc.dg/asan/pr78541.c (main): Likewise.
* gcc.dg/asan/use-after-scope-1.c (main): Likewise.
* gcc.dg/asan/use-after-scope-10.c (main): Likewise.
* gcc.dg/asan/use-after-scope-2.c (main): Likewise.
* gcc.dg/asan/use-after-scope-3.c (main): Likewise.
* gcc.dg/asan/use-after-scope-5.c (main): Likewise.
* gcc.dg/asan/use-after-scope-9.c (main): Likewise.

From-SVN: r264951

22 files changed:
gcc/ChangeLog
gcc/asan.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/asan/pr64820.c
gcc/testsuite/c-c++-common/asan/use-after-return-1.c
gcc/testsuite/g++.dg/asan/function-argument-1.C
gcc/testsuite/g++.dg/asan/function-argument-2.C
gcc/testsuite/g++.dg/asan/function-argument-3.C
gcc/testsuite/g++.dg/asan/use-after-scope-1.C
gcc/testsuite/g++.dg/asan/use-after-scope-2.C
gcc/testsuite/g++.dg/asan/use-after-scope-types-1.C
gcc/testsuite/g++.dg/asan/use-after-scope-types-2.C
gcc/testsuite/g++.dg/asan/use-after-scope-types-3.C
gcc/testsuite/g++.dg/asan/use-after-scope-types-4.C
gcc/testsuite/g++.dg/asan/use-after-scope-types-5.C
gcc/testsuite/gcc.dg/asan/pr78541.c
gcc/testsuite/gcc.dg/asan/use-after-scope-1.c
gcc/testsuite/gcc.dg/asan/use-after-scope-10.c
gcc/testsuite/gcc.dg/asan/use-after-scope-2.c
gcc/testsuite/gcc.dg/asan/use-after-scope-3.c
gcc/testsuite/gcc.dg/asan/use-after-scope-5.c
gcc/testsuite/gcc.dg/asan/use-after-scope-9.c

index 430b614d0d7a27c7f1ba38ecaf2c9bfc22f4f313..4ccb6e1138e971e1b8c8353544748feb3289a1e2 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-09  Martin Liska  <mliska@suse.cz>
+
+       * asan.c (asan_emit_stack_protection): If a stack variable
+       is located in a same file as current function, then emit
+       line info into variable definition string.
+
 2018-10-08  Eric Botcazou  <ebotcazou@adacore.com>
 
        * print-rtl.c (rtx_writer::print_rtx_operand_code_i): Print column
index 235e219479d006779228cde9ae8ff559067d29a1..b2c41187b91432c4031b708d6bdf74af10672b5a 100644 (file)
@@ -1269,6 +1269,9 @@ asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb,
   if (shadow_ptr_types[0] == NULL_TREE)
     asan_init_shadow_ptr_types ();
 
+  expanded_location cfun_xloc
+    = expand_location (DECL_SOURCE_LOCATION (current_function_decl));
+
   /* First of all, prepare the description string.  */
   pretty_printer asan_pp;
 
@@ -1281,15 +1284,30 @@ asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb,
       pp_space (&asan_pp);
       pp_wide_integer (&asan_pp, offsets[l - 1] - offsets[l]);
       pp_space (&asan_pp);
+
+      expanded_location xloc
+       = expand_location (DECL_SOURCE_LOCATION (decl));
+      char location[32];
+
+      if (xloc.file == cfun_xloc.file)
+       sprintf (location, ":%d", xloc.line);
+      else
+       location[0] = '\0';
+
       if (DECL_P (decl) && DECL_NAME (decl))
        {
-         pp_decimal_int (&asan_pp, IDENTIFIER_LENGTH (DECL_NAME (decl)));
+         unsigned idlen
+           = IDENTIFIER_LENGTH (DECL_NAME (decl)) + strlen (location);
+         pp_decimal_int (&asan_pp, idlen);
          pp_space (&asan_pp);
          pp_tree_identifier (&asan_pp, DECL_NAME (decl));
+         pp_string (&asan_pp, location);
        }
       else
        pp_string (&asan_pp, "9 <unknown>");
-      pp_space (&asan_pp);
+
+      if (l > 2)
+       pp_space (&asan_pp);
     }
   str_cst = asan_pp_string (&asan_pp);
 
index 6a8605b2c7a94d32c48fda6f60e9ba7f3e73ecc6..eed63b2431662d9485d4731e19d414de7d43181d 100644 (file)
@@ -1,3 +1,26 @@
+2018-10-09  Martin Liska  <mliska@suse.cz>
+
+       * c-c++-common/asan/pr64820.c: Add line number to scanned
+       pattern.
+       * c-c++-common/asan/use-after-return-1.c: Likewise.
+       * g++.dg/asan/function-argument-1.C (main): Likewise.
+       * g++.dg/asan/function-argument-2.C (main): Likewise.
+       * g++.dg/asan/function-argument-3.C (main): Likewise.
+       * g++.dg/asan/use-after-scope-1.C (main): Likewise.
+       * g++.dg/asan/use-after-scope-2.C (main): Likewise.
+       * g++.dg/asan/use-after-scope-types-1.C (main): Likewise.
+       * g++.dg/asan/use-after-scope-types-2.C (main): Likewise.
+       * g++.dg/asan/use-after-scope-types-3.C (main): Likewise.
+       * g++.dg/asan/use-after-scope-types-4.C (main): Likewise.
+       * g++.dg/asan/use-after-scope-types-5.C (main): Likewise.
+       * gcc.dg/asan/pr78541.c (main): Likewise.
+       * gcc.dg/asan/use-after-scope-1.c (main): Likewise.
+       * gcc.dg/asan/use-after-scope-10.c (main): Likewise.
+       * gcc.dg/asan/use-after-scope-2.c (main): Likewise.
+       * gcc.dg/asan/use-after-scope-3.c (main): Likewise.
+       * gcc.dg/asan/use-after-scope-5.c (main): Likewise.
+       * gcc.dg/asan/use-after-scope-9.c (main): Likewise.
+
 2018-10-09  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/87151
index 885a662149179a0fd103073f554ea95fc24f184d..a00debf358833ef8de1f2b6ba9d50a2d68c86296 100644 (file)
@@ -28,4 +28,4 @@ int main(int argc, char **argv) {
 /* { dg-output "WRITE of size 1 at .* thread T0.*" } */
 /* { dg-output "    #0.*(Func2)?.*pr64820.(c:21)?.*" } */
 /* { dg-output "is located in stack of thread T0 at offset.*" } */
-/* { dg-output "\'local\' <== Memory access at offset 32 is inside this variable" } */
+/* { dg-output "\'local\' \\(line 14\\) <== Memory access at offset 32 is inside this variable" } */
index 49933e531b92fa631120b01b3f75387b14509dcb..e1bb18a574319b3ecde14af53eb1d2730608ba88 100644 (file)
@@ -50,4 +50,4 @@ int main(int argc, char **argv) {
 /* { dg-output "WRITE of size 1 at .* thread T0.*" } */
 /* { dg-output "    #0.*(Func2)?.*use-after-return-1.(c:31)?.*" } */
 /* { dg-output "is located in stack of thread T0 at offset.*" } */
-/* { dg-output "\'local\' <== Memory access at offset 32 is inside this variable" } */
+/* { dg-output "\'local\' \\(line 24\\) <== Memory access at offset 32 is inside this variable" } */
index bdbb37a44a4754ea289a5a75ae66a18629a507f4..f421ad68b5db2613176745e4444b3c1fc4ffd10c 100644 (file)
@@ -28,4 +28,4 @@ main ()
 
 // { dg-output "ERROR: AddressSanitizer: stack-buffer-underflow on address.*(\n|\r\n|\r)" }
 // { dg-output "READ of size . at.*" }
-// { dg-output ".*'arg' <== Memory access at offset \[0-9\]* underflows this variable.*" }
+// { dg-output ".*'arg' \\(line 18\\) <== Memory access at offset \[0-9\]* underflows this variable.*" }
index 3a7c33bdaaa43e53fe1c71ccf9966d35952ea0a7..bdd3dc6e49f0f9f00ae847783c1e66c01a3a0c1c 100644 (file)
@@ -21,4 +21,4 @@ main ()
 
 // { dg-output "ERROR: AddressSanitizer: stack-buffer-overflow on address.*(\n|\r\n|\r)" }
 // { dg-output "READ of size . at.*" }
-// { dg-output ".*'arg' <== Memory access at offset \[0-9\]* partially overflows this variable.*" }
+// { dg-output ".*'arg' \\(line 11\\) <== Memory access at offset \[0-9\]* partially overflows this variable.*" }
index 6994b6df1c83db1c38a77361e5127f96abc5c615..26b3f9268afe2dd9de8ee2f5493ebaaec5c9dcee 100644 (file)
@@ -25,4 +25,4 @@ main ()
 
 // { dg-output "ERROR: AddressSanitizer: stack-buffer-overflow on address.*(\n|\r\n|\r)" }
 // { dg-output "READ of size . at.*" }
-// { dg-output ".*'arg' <== Memory access at offset \[0-9\]* overflows this variable.*" }
+// { dg-output ".*'arg' \\(line 14\\) <== Memory access at offset \[0-9\]* overflows this variable.*" }
index fd875ad7a13cb57635cb6c336aec75a87f1137d3..4cbc5345b577d947bc6598460a605b4585e023d8 100644 (file)
@@ -18,4 +18,4 @@ int main() {
 
 // { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
 // { dg-output "READ of size 4 at.*" }
-// { dg-output ".*'v' <== Memory access at offset \[0-9\]* is inside this variable.*" }
+// { dg-output ".*'v' \\(line 9\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
index 92a4bd13029058c70c0b9735762f8be96e7f00bc..5d11834dfebdc70b017419ab605b360909c7d5d6 100644 (file)
@@ -37,4 +37,4 @@ int main(int argc, char **argv)
 
 // { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
 // { dg-output "READ of size 4 at.*" }
-// { dg-output ".*'x' <== Memory access at offset \[0-9\]* is inside this variable.*" }
+// { dg-output ".*'x' \\(line 31\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
index bedcfa4edb92081b38ee7cc9fade7278d2f66274..180804ca81ddf49d9a155a084383c63b58ab85d9 100644 (file)
@@ -14,4 +14,4 @@ int main()
 
 // { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
 // { dg-output "WRITE of size " }
-// { dg-output ".*'x' <== Memory access at offset \[0-9\]* is inside this variable.*" }
+// { dg-output ".*'x' \\(line 25\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
index 75a01d9eb3674d8e539d7f488bd877beff0255e3..172c5c03b2ec2dfa3f1c0cc01e453303e73a8d79 100644 (file)
@@ -14,4 +14,4 @@ int main()
 
 // { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
 // { dg-output "WRITE of size " }
-// { dg-output ".*'x' <== Memory access at offset \[0-9\]* is inside this variable.*" }
+// { dg-output ".*'x' \\(line 25\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
index 3350c69c6ae68d8df7bfc4409e154b9b7273c9e0..d4ad0fcc3a5bbe08a5101cd7d71e19881e54ae2e 100644 (file)
@@ -14,4 +14,4 @@ int main()
 
 // { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
 // { dg-output "WRITE of size " }
-// { dg-output ".*'x' <== Memory access at offset \[0-9\]* is inside this variable.*" }
+// { dg-output ".*'x' \\(line 25\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
index 44f4d3b09f544dc078001d65b26a9159de5ed538..7638107d2cca69b1636a66ec81a59be1d70f3c07 100644 (file)
@@ -14,4 +14,4 @@ int main()
 
 // { 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.*" }
+// { dg-output ".*'x' \\(line 25\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
index 42abc2a0ccd7e5ed63deaf47851e26417d6ecf7d..fe7c57fc37be1aa295b796e051657e3f4cc08e97 100644 (file)
@@ -14,4 +14,4 @@ int main()
 
 // { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
 // { dg-output "WRITE of size " }
-// { dg-output ".*'x' <== Memory access at offset \[0-9\]* is inside this variable.*" }
+// { dg-output ".*'x' \\(line 25\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
index fb02082f3d942c27e754899aa8ab3bbf3b040867..612c7e5807197c581619fedc1b2d48fbb34d50a2 100644 (file)
@@ -22,4 +22,4 @@ int main()
 
 // { 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.*" }
+// { dg-output ".*'x' \\(line 9\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
index bdbc97becae979d281b8c40bcfa56d621a6652dd..19a8379f4afbe623f9dbce61da422fd55e73db28 100644 (file)
@@ -15,4 +15,4 @@ main (void)
 
 // { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
 // { dg-output "READ of size 1 at.*" }
-// { dg-output ".*'my_char' <== Memory access at offset \[0-9\]* is inside this variable.*" }
+// { dg-output ".*'my_char' \\(line 9\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
index 60f45768019fc5ce47a5ffd28ae8ee7260a301a3..e4b986ec0719ab2e2055b1bb40bdd2da0f988744 100644 (file)
@@ -20,4 +20,4 @@ main (int argc, char **argv)
 
 // { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
 // { dg-output "WRITE of size .*" }
-// { dg-output ".*'a' <== Memory access at offset \[0-9\]* is inside this variable.*" }
+// { dg-output ".*'a' \\(line 12\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
index dedb73400cdcaa8de856ef9866fb78d1547cee77..101858126ff506d6ad0f00876b33d76738ef6abb 100644 (file)
@@ -44,4 +44,4 @@ main (void)
 
 // { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
 // { dg-output "READ of size 4 at.*" }
-// { dg-output ".*'c' <== Memory access at offset \[0-9\]* is inside this variable.*" }
+// { dg-output ".*'c' \\(line 37\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
index ddf3c04eb456bbb8ba87628a565c59422b39f43f..8f8533760c55e356a053cfbf174be5996a34a28c 100644 (file)
@@ -18,4 +18,4 @@ main (void)
 
 // { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
 // { dg-output "WRITE of size 1 at.*" }
-// { dg-output ".*'my_char' <== Memory access at offset \[0-9\]* overflows this variable.*" }
+// { dg-output ".*'my_char' \\(line 11\\) <== Memory access at offset \[0-9\]* overflows this variable.*" }
index b53712daa34ae0b59cae3749afb7cc712f2b29c9..1c2fafb43be1c2028de8b9b472d37372bf069e0b 100644 (file)
@@ -24,4 +24,4 @@ main (int argc, char **argv)
 
 // { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
 // { dg-output "READ of size 4 at.*" }
-// { dg-output ".*'values' <== Memory access at offset \[0-9\]* is inside this variable.*" }
+// { dg-output ".*'values' \\(line 10\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
index c3e4da55aade001b6cc880057a3225347f8021ef..853765bf3cc1d537bfcd8b370c9c26996e52a049 100644 (file)
@@ -20,4 +20,4 @@ main (int argc, char **argv)
 // { dg-final { scan-tree-dump-times {= \.ASAN_POISON \(\)} 1 "asan1" } }
 // { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" }
 // { dg-output "READ of size .*" }
-// { dg-output ".*'a' <== Memory access at offset \[0-9\]* is inside this variable.*" }
+// { dg-output ".*'a' \\(line 12\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }