Commit 98a7a34e by Marek Polacek Committed by Marek Polacek

re PR sanitizer/80348 (UBSAN: compile time crash in ubsan_instrument_division)

	PR sanitizer/80348
	* typeck.c (cp_build_binary_op): Use NULL_TREE instead of NULL.  Set
	ORIG_TYPE earlier and not only when shortening.

	* g++.dg/ubsan/div-by-zero-3.C: New test.

From-SVN: r246812
parent 46bf3f84
2017-04-10 Marek Polacek <polacek@redhat.com>
PR sanitizer/80348
* typeck.c (cp_build_binary_op): Use NULL_TREE instead of NULL. Set
ORIG_TYPE earlier and not only when shortening.
2017-04-07 Jason Merrill <jason@redhat.com> 2017-04-07 Jason Merrill <jason@redhat.com>
PR c++/80356 - ICE with reference to function template argument. PR c++/80356 - ICE with reference to function template argument.
......
...@@ -4105,7 +4105,7 @@ cp_build_binary_op (location_t location, ...@@ -4105,7 +4105,7 @@ cp_build_binary_op (location_t location,
/* Data type in which the computation is to be performed. /* Data type in which the computation is to be performed.
In the simplest cases this is the common type of the arguments. */ In the simplest cases this is the common type of the arguments. */
tree result_type = NULL; tree result_type = NULL_TREE;
/* Nonzero means operands have already been type-converted /* Nonzero means operands have already been type-converted
in whatever way is necessary. in whatever way is necessary.
...@@ -4121,7 +4121,6 @@ cp_build_binary_op (location_t location, ...@@ -4121,7 +4121,6 @@ cp_build_binary_op (location_t location,
tree final_type = 0; tree final_type = 0;
tree result, result_ovl; tree result, result_ovl;
tree orig_type = NULL;
/* Nonzero if this is an operation like MIN or MAX which can /* Nonzero if this is an operation like MIN or MAX which can
safely be computed in short if both args are promoted shorts. safely be computed in short if both args are promoted shorts.
...@@ -4153,7 +4152,7 @@ cp_build_binary_op (location_t location, ...@@ -4153,7 +4152,7 @@ cp_build_binary_op (location_t location,
bool doing_shift = false; bool doing_shift = false;
/* Tree holding instrumentation expression. */ /* Tree holding instrumentation expression. */
tree instrument_expr = NULL; tree instrument_expr = NULL_TREE;
if (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR if (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
|| code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
...@@ -5042,6 +5041,10 @@ cp_build_binary_op (location_t location, ...@@ -5042,6 +5041,10 @@ cp_build_binary_op (location_t location,
return tmp; return tmp;
} }
/* Remember the original type; RESULT_TYPE might be changed later on
by shorten_binary_op. */
tree orig_type = result_type;
if (arithmetic_types_p) if (arithmetic_types_p)
{ {
bool first_complex = (code0 == COMPLEX_TYPE); bool first_complex = (code0 == COMPLEX_TYPE);
...@@ -5138,7 +5141,6 @@ cp_build_binary_op (location_t location, ...@@ -5138,7 +5141,6 @@ cp_build_binary_op (location_t location,
if (shorten && none_complex) if (shorten && none_complex)
{ {
orig_type = result_type;
final_type = result_type; final_type = result_type;
result_type = shorten_binary_op (result_type, op0, op1, result_type = shorten_binary_op (result_type, op0, op1,
shorten == -1); shorten == -1);
...@@ -5218,13 +5220,10 @@ cp_build_binary_op (location_t location, ...@@ -5218,13 +5220,10 @@ cp_build_binary_op (location_t location,
original result_type. */ original result_type. */
tree cop0 = op0; tree cop0 = op0;
tree cop1 = op1; tree cop1 = op1;
if (orig_type != NULL_TREE) if (TREE_TYPE (cop0) != orig_type)
{ cop0 = cp_convert (orig_type, op0, complain);
if (TREE_TYPE (cop0) != orig_type) if (TREE_TYPE (cop1) != orig_type)
cop0 = cp_convert (orig_type, op0, complain); cop1 = cp_convert (orig_type, op1, complain);
if (TREE_TYPE (cop1) != orig_type)
cop1 = cp_convert (orig_type, op1, complain);
}
instrument_expr = ubsan_instrument_division (location, cop0, cop1); instrument_expr = ubsan_instrument_division (location, cop0, cop1);
} }
else if (doing_shift && (flag_sanitize & SANITIZE_SHIFT)) else if (doing_shift && (flag_sanitize & SANITIZE_SHIFT))
......
2017-04-10 Marek Polacek <polacek@redhat.com>
PR sanitizer/80348
* g++.dg/ubsan/div-by-zero-3.C: New test.
2017-04-10 Bin Cheng <bin.cheng@arm.com> 2017-04-10 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/80153 PR tree-optimization/80153
......
// PR sanitizer/80348
// { dg-do compile }
// { dg-options "-fsanitize=integer-divide-by-zero" }
extern long long int i;
void
fn1 ()
{
(0 >= 10253361740180 >= long (0 >= 0)) % i;
}
void
fn2 ()
{
0 / unsigned (!(0 - 3) >= (0 > 0));
}
void
fn3 ()
{
(0 < 0 >= (0 < 0 < 0)) % (unsigned (2) << 0);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment