diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-06-13 22:05:20 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-06-13 22:05:20 +0200 |
commit | f31a8339835b2dda14b622cf35555ea666966a9a (patch) | |
tree | b9c27822cedec984109a2bf21ac94eb5c0961a8d | |
parent | c60dc05326dbf6960dbaa898db854fd062afeecd (diff) | |
download | gcc-f31a8339835b2dda14b622cf35555ea666966a9a.zip gcc-f31a8339835b2dda14b622cf35555ea666966a9a.tar.gz gcc-f31a8339835b2dda14b622cf35555ea666966a9a.tar.bz2 |
re PR sanitizer/80973 (ICE with lambda and -fsanitize=undefined)
PR c++/80973
* cp-gimplify.c (cp_genericize_r): Don't instrument MEM_REF second
argument even if it has REFERENCE_TYPE.
* g++.dg/ubsan/pr80973.C: New test.
From-SVN: r249174
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ubsan/pr80973.C | 16 |
4 files changed, 33 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ae91a9d..ca0f9b2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2017-06-13 Jakub Jelinek <jakub@redhat.com> + PR c++/80973 + * cp-gimplify.c (cp_genericize_r): Don't instrument MEM_REF second + argument even if it has REFERENCE_TYPE. + PR c++/80984 * cp-gimplify.c (cp_genericize): Only look for VAR_DECLs in BLOCK_VARS (outer) chain. diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index d546208..a0abd51 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -1450,6 +1450,16 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) *stmt_p = cplus_expand_constant (stmt); *walk_subtrees = 0; } + else if (TREE_CODE (stmt) == MEM_REF) + { + /* For MEM_REF, make sure not to sanitize the second operand even + if it has reference type. It is just an offset with a type + holding other information. There is no other processing we + need to do for INTEGER_CSTs, so just ignore the second argument + unconditionally. */ + cp_walk_tree (&TREE_OPERAND (stmt, 0), cp_genericize_r, data, NULL); + *walk_subtrees = 0; + } else if (sanitize_flags_p ((SANITIZE_NULL | SANITIZE_ALIGNMENT | SANITIZE_VPTR)) && !wtd->no_sanitize_p) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5164fa9..f32b8c8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2017-06-13 Jakub Jelinek <jakub@redhat.com> + PR c++/80973 + * g++.dg/ubsan/pr80973.C: New test. + PR c++/80984 * g++.dg/opt/nrv18.C: New test. diff --git a/gcc/testsuite/g++.dg/ubsan/pr80973.C b/gcc/testsuite/g++.dg/ubsan/pr80973.C new file mode 100644 index 0000000..b534fdb --- /dev/null +++ b/gcc/testsuite/g++.dg/ubsan/pr80973.C @@ -0,0 +1,16 @@ +// PR c++/80973 +// { dg-do compile } +// { dg-options "-fsanitize=undefined -std=c++14" } + +struct A { + A(); + A(const A &); +}; +struct B { + B(); + template <typename... Args> auto g(Args &&... p1) { + return [=] { f(p1...); }; + } + void f(A, const char *); +}; +B::B() { g(A(), ""); } |