re PR c++/77722 (-fsanitize=undefined doesn't give runtime error in function without...
authorJakub Jelinek <jakub@redhat.com>
Tue, 27 Sep 2016 18:15:21 +0000 (20:15 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 27 Sep 2016 18:15:21 +0000 (20:15 +0200)
PR c++/77722
* cp-gimplify.c (cp_ubsan_maybe_instrument_return): Instrument also
functions that have just a STATEMENT_LIST instead of BIND_EXPR, or
BIND_EXPR with some statement rather than STATEMENT_LIST as body.

* g++.dg/ubsan/return-4.C: New test.
* g++.dg/ubsan/return-5.C: New test.
* g++.dg/ubsan/return-6.C: New test.

From-SVN: r240555

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ubsan/return-4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ubsan/return-5.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ubsan/return-6.C [new file with mode: 0644]

index f250a82f4fbb2b4d275cff86898d77816c2c0c96..75c9d362c3caf4c9a45a40179bbaf90ef539d444 100644 (file)
@@ -1,3 +1,10 @@
+2016-09-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/77722
+       * cp-gimplify.c (cp_ubsan_maybe_instrument_return): Instrument also
+       functions that have just a STATEMENT_LIST instead of BIND_EXPR, or
+       BIND_EXPR with some statement rather than STATEMENT_LIST as body.
+
 2016-09-26  Nathan Sidwell  <nathan@acm.org>
 
        * init.c (expand_default_init): Fix } indentation.
index 6d514d0e99e2564ad1cc43f24e8ef06df811823d..5aca8f2a3b0da3d160e01efe57872d289c47f3bd 100644 (file)
@@ -1570,14 +1570,11 @@ cp_ubsan_maybe_instrument_return (tree fndecl)
     }
   if (t == NULL_TREE)
     return;
-  t = DECL_SAVED_TREE (fndecl);
-  if (TREE_CODE (t) == BIND_EXPR
-      && TREE_CODE (BIND_EXPR_BODY (t)) == STATEMENT_LIST)
-    {
-      tree_stmt_iterator i = tsi_last (BIND_EXPR_BODY (t));
-      t = ubsan_instrument_return (DECL_SOURCE_LOCATION (fndecl));
-      tsi_link_after (&i, t, TSI_NEW_STMT);
-    }
+  tree *p = &DECL_SAVED_TREE (fndecl);
+  if (TREE_CODE (*p) == BIND_EXPR)
+    p = &BIND_EXPR_BODY (*p);
+  t = ubsan_instrument_return (DECL_SOURCE_LOCATION (fndecl));
+  append_to_statement_list (t, p);
 }
 
 void
index ddbb5253e94f4a7922f34273d15179618521cf0e..443a9178d0682b532533d8f269ea94eefd949667 100644 (file)
@@ -1,3 +1,10 @@
+2016-09-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/77722
+       * g++.dg/ubsan/return-4.C: New test.
+       * g++.dg/ubsan/return-5.C: New test.
+       * g++.dg/ubsan/return-6.C: New test.
+
 2016-09-27  Jiong Wang  <jiong.wang@arm.com>
 
        * lib/target-supports.exp
diff --git a/gcc/testsuite/g++.dg/ubsan/return-4.C b/gcc/testsuite/g++.dg/ubsan/return-4.C
new file mode 100644 (file)
index 0000000..d30eef8
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/77722
+// { dg-do run }
+// { dg-options "-fsanitize=return -w" }
+// { dg-shouldfail "ubsan" }
+
+int
+foo ()
+{
+}
+
+int
+main ()
+{
+  foo ();
+  return 0;
+}
+
+// { dg-output "execution reached the end of a value-returning function without returning a value" }
diff --git a/gcc/testsuite/g++.dg/ubsan/return-5.C b/gcc/testsuite/g++.dg/ubsan/return-5.C
new file mode 100644 (file)
index 0000000..2956c33
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/77722
+// { dg-do run }
+// { dg-options "-fsanitize=return -w" }
+// { dg-shouldfail "ubsan" }
+
+int
+foo ()
+{
+  int a = 5;
+}
+
+int
+main ()
+{
+  foo ();
+  return 0;
+}
+
+// { dg-output "execution reached the end of a value-returning function without returning a value" }
diff --git a/gcc/testsuite/g++.dg/ubsan/return-6.C b/gcc/testsuite/g++.dg/ubsan/return-6.C
new file mode 100644 (file)
index 0000000..0c1e792
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/77722
+// { dg-do run }
+// { dg-options "-fsanitize=return -w" }
+// { dg-shouldfail "ubsan" }
+
+int
+foo ()
+{
+  int a = 5;
+  int b = 5;
+}
+
+int
+main ()
+{
+  foo ();
+  return 0;
+}
+
+// { dg-output "execution reached the end of a value-returning function without returning a value" }