diff options
author | Marek Polacek <polacek@redhat.com> | 2017-04-07 17:51:55 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2017-04-07 17:51:55 +0000 |
commit | 1ef532f452a10223cf9cd8f6955f066149d78498 (patch) | |
tree | c3056a470e965614fe4e03e803e87f816e4211a5 /gcc | |
parent | 29d8aae6bdb1fba656e0c4f768743015c96bc238 (diff) | |
download | gcc-1ef532f452a10223cf9cd8f6955f066149d78498.zip gcc-1ef532f452a10223cf9cd8f6955f066149d78498.tar.gz gcc-1ef532f452a10223cf9cd8f6955f066149d78498.tar.bz2 |
re PR sanitizer/80348 (UBSAN: compile time crash in ubsan_instrument_division)
PR sanitizer/80348
* typeck.c (cp_build_binary_op): Convert COP[01] to ORIG_TYPE.
* g++.dg/ubsan/div-by-zero-2.C: New test.
From-SVN: r246770
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ubsan/div-by-zero-2.C | 10 |
4 files changed, 25 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9b1f89d..5ffd1b7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2017-04-07 Marek Polacek <polacek@redhat.com> + + PR sanitizer/80348 + * typeck.c (cp_build_binary_op): Convert COP[01] to ORIG_TYPE. + 2017-04-05 Jakub Jelinek <jakub@redhat.com> PR c++/80309 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 79391c0..65a3435 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -5218,10 +5218,12 @@ cp_build_binary_op (location_t location, original result_type. */ tree cop0 = op0; tree cop1 = op1; - if (orig_type != NULL && result_type != orig_type) + if (orig_type != NULL_TREE) { - cop0 = cp_convert (orig_type, op0, complain); - cop1 = cp_convert (orig_type, op1, complain); + if (TREE_TYPE (cop0) != orig_type) + cop0 = cp_convert (orig_type, op0, complain); + if (TREE_TYPE (cop1) != orig_type) + cop1 = cp_convert (orig_type, op1, complain); } instrument_expr = ubsan_instrument_division (location, cop0, cop1); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 94fe5a0..fbaef7a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-04-07 Marek Polacek <polacek@redhat.com> + + PR sanitizer/80348 + * g++.dg/ubsan/div-by-zero-2.C: New test. + 2017-04-07 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/70478 diff --git a/gcc/testsuite/g++.dg/ubsan/div-by-zero-2.C b/gcc/testsuite/g++.dg/ubsan/div-by-zero-2.C new file mode 100644 index 0000000..d500ae6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ubsan/div-by-zero-2.C @@ -0,0 +1,10 @@ +// PR sanitizer/80348 +// { dg-do compile } +// { dg-options "-fsanitize=integer-divide-by-zero" } + +void +foo () +{ + if (0) + unsigned ((0 != 60806) > (0 != 0)) / 0; // { dg-warning "division by zero" } +} |