summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-12-07 22:35:29 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-12-07 22:35:29 +0000
commitdeadc75877d552e7ac69c429b301b0d6d66d1d6e (patch)
treee17969a91a3ba63c1e8d6a2fbb6505ddaa017ae5 /gcc
parentcbb20dcfbcdf82d4aeeda78e15fd87122b28efb7 (diff)
downloadgcc-deadc75877d552e7ac69c429b301b0d6d66d1d6e.tar.gz
Backported from mainline
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. * g++.dg/ubsan/return-4.C: New test. * g++.dg/ubsan/return-5.C: New test. * g++.dg/ubsan/return-6.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@243389 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/cp-gimplify.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ubsan/return-4.C18
-rw-r--r--gcc/testsuite/g++.dg/ubsan/return-5.C19
-rw-r--r--gcc/testsuite/g++.dg/ubsan/return-6.C20
6 files changed, 74 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6ed84dffd1b..92722b0c07f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,6 +1,13 @@
2016-12-07 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
+ 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-20 Jakub Jelinek <jakub@redhat.com>
PR c++/77638
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index edea6f53f5d..96f74c76267 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -1507,14 +1507,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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 23b05f52d2b..f3eef2ba99b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -3,6 +3,11 @@
Backported from mainline
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.
+
PR fortran/77666
* gfortran.dg/gomp/pr77666.f90: New test.
diff --git a/gcc/testsuite/g++.dg/ubsan/return-4.C b/gcc/testsuite/g++.dg/ubsan/return-4.C
new file mode 100644
index 00000000000..d30eef8e31f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ubsan/return-4.C
@@ -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
index 00000000000..2956c33a094
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ubsan/return-5.C
@@ -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
index 00000000000..0c1e7921c81
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ubsan/return-6.C
@@ -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" }