diff options
author | Marek Polacek <polacek@redhat.com> | 2014-12-01 15:37:55 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2014-12-01 15:37:55 +0000 |
commit | 7d1f4ae5f155c0656ef53d7692bb81b424c28220 (patch) | |
tree | f5e772a5db0e1bb4fe04aba925539a5ef99d36fb /gcc | |
parent | 0b274c179f478df449d66bd0707cb9aa05dcafed (diff) | |
download | gcc-7d1f4ae5f155c0656ef53d7692bb81b424c28220.zip gcc-7d1f4ae5f155c0656ef53d7692bb81b424c28220.tar.gz gcc-7d1f4ae5f155c0656ef53d7692bb81b424c28220.tar.bz2 |
re PR tree-optimization/64121 (ICE: SSA corruption with -O -fsanitize=undefined)
PR sanitizer/64121
* ubsan.c (instrument_object_size): Stop searching if the base
occurs in abnormal phi.
* c-c++-common/ubsan/pr64121.c: New test.
Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r218222
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/ubsan/pr64121.c | 16 | ||||
-rw-r--r-- | gcc/ubsan.c | 9 |
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f75ecf5..08f4096 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,11 @@ 2014-12-01 Marek Polacek <polacek@redhat.com> + Jakub Jelinek <jakub@redhat.com> + + PR sanitizer/64121 + * ubsan.c (instrument_object_size): Stop searching if the base + occurs in abnormal phi. + +2014-12-01 Marek Polacek <polacek@redhat.com> PR sanitizer/63956 * ubsan.c (is_ubsan_builtin_p): Check also built-in class. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d7635f2..3be4a88 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2014-12-01 Marek Polacek <polacek@redhat.com> + PR sanitizer/64121 + * c-c++-common/ubsan/pr64121.c: New test. + +2014-12-01 Marek Polacek <polacek@redhat.com> + PR sanitizer/63956 * c-c++-common/ubsan/shift-5.c: Add xfails. * g++.dg/ubsan/div-by-zero-1.C: Don't use -w. Add xfail. diff --git a/gcc/testsuite/c-c++-common/ubsan/pr64121.c b/gcc/testsuite/c-c++-common/ubsan/pr64121.c new file mode 100644 index 0000000..614d72a --- /dev/null +++ b/gcc/testsuite/c-c++-common/ubsan/pr64121.c @@ -0,0 +1,16 @@ +/* PR sanitizer/64121 */ +/* { dg-do compile } */ +/* { dg-options "-fsanitize=undefined -Wno-pointer-arith" } */ + +extern int tab[16]; + +void +execute (int *ip, int x) +{ + int *xp = tab; +base: + if (x) + return; + *xp++ = *ip; + goto *(&&base + *ip); +} diff --git a/gcc/ubsan.c b/gcc/ubsan.c index cff0982..fb5f104 100644 --- a/gcc/ubsan.c +++ b/gcc/ubsan.c @@ -1563,7 +1563,14 @@ instrument_object_size (gimple_stmt_iterator *gsi, bool is_lhs) && POINTER_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (def_stmt)))) || (is_gimple_assign (def_stmt) && gimple_assign_rhs_code (def_stmt) == POINTER_PLUS_EXPR)) - base = gimple_assign_rhs1 (def_stmt); + { + tree rhs1 = gimple_assign_rhs1 (def_stmt); + if (TREE_CODE (rhs1) == SSA_NAME + && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1)) + break; + else + base = rhs1; + } else break; } |