diff options
author | Marek Polacek <polacek@redhat.com> | 2013-09-25 08:58:57 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2013-09-25 08:58:57 +0000 |
commit | b56e978833b09ba47ebc4ebdace007164b493266 (patch) | |
tree | 083cf293ac56951841b59e2db56b5176d154c73a /gcc/c-family | |
parent | 550dfe7f28a031f5ffe59c423c7790d219414ff6 (diff) | |
download | gcc-b56e978833b09ba47ebc4ebdace007164b493266.zip gcc-b56e978833b09ba47ebc4ebdace007164b493266.tar.gz gcc-b56e978833b09ba47ebc4ebdace007164b493266.tar.bz2 |
re PR sanitizer/58413 (ubsan constant folding)
PR sanitizer/58413
c-family/
* c-ubsan.c (ubsan_instrument_shift): Don't instrument
an expression if we can prove it is correct.
(ubsan_instrument_division): Likewise. Remove unnecessary
check.
testsuite/
* c-c++-common/ubsan/shift-5.c: New test.
* c-c++-common/ubsan/shift-6.c: New test.
* c-c++-common/ubsan/div-by-zero-5.c: New test.
* gcc.dg/ubsan/c-shift-1.c: New test.
Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r202886
Diffstat (limited to 'gcc/c-family')
-rw-r--r-- | gcc/c-family/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/c-family/c-ubsan.c | 18 |
2 files changed, 19 insertions, 8 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 1772ba5..c7a8c787 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,12 @@ +2013-09-25 Marek Polacek <polacek@redhat.com> + Jakub Jelinek <jakub@redhat.com> + + PR sanitizer/58413 + * c-ubsan.c (ubsan_instrument_shift): Don't instrument + an expression if we can prove it is correct. + (ubsan_instrument_division): Likewise. Remove unnecessary + check. + 2013-09-18 Marek Polacek <polacek@redhat.com> PR sanitizer/58411 diff --git a/gcc/c-family/c-ubsan.c b/gcc/c-family/c-ubsan.c index 9f43f6d..0bfc660 100644 --- a/gcc/c-family/c-ubsan.c +++ b/gcc/c-family/c-ubsan.c @@ -51,14 +51,6 @@ ubsan_instrument_division (location_t loc, tree op0, tree op1) if (TREE_CODE (type) != INTEGER_TYPE) return NULL_TREE; - /* If we *know* that the divisor is not -1 or 0, we don't have to - instrument this expression. - ??? We could use decl_constant_value to cover up more cases. */ - if (TREE_CODE (op1) == INTEGER_CST - && integer_nonzerop (op1) - && !integer_minus_onep (op1)) - return NULL_TREE; - t = fold_build2 (EQ_EXPR, boolean_type_node, op1, build_int_cst (type, 0)); @@ -74,6 +66,11 @@ ubsan_instrument_division (location_t loc, tree op0, tree op1) t = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, t, x); } + /* If the condition was folded to 0, no need to instrument + this expression. */ + if (integer_zerop (t)) + return NULL_TREE; + /* In case we have a SAVE_EXPR in a conditional context, we need to make sure it gets evaluated before the condition. */ t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), op0, t); @@ -138,6 +135,11 @@ ubsan_instrument_shift (location_t loc, enum tree_code code, tt = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, x, tt); } + /* If the condition was folded to 0, no need to instrument + this expression. */ + if (integer_zerop (t) && (tt == NULL_TREE || integer_zerop (tt))) + return NULL_TREE; + /* In case we have a SAVE_EXPR in a conditional context, we need to make sure it gets evaluated before the condition. */ t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), op0, t); |