diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-12-07 22:35:29 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-12-07 22:35:29 +0000 |
commit | deadc75877d552e7ac69c429b301b0d6d66d1d6e (patch) | |
tree | e17969a91a3ba63c1e8d6a2fbb6505ddaa017ae5 /gcc | |
parent | cbb20dcfbcdf82d4aeeda78e15fd87122b28efb7 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ubsan/return-4.C | 18 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ubsan/return-5.C | 19 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ubsan/return-6.C | 20 |
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" } |