@@ -659,35 +659,26 @@ static int zend_inference_calc_binary_op_range(
659
659
op2_min = OP2_MIN_RANGE ();
660
660
op1_max = OP1_MAX_RANGE ();
661
661
op2_max = OP2_MAX_RANGE ();
662
- if (op2_min <= 0 && op2_max >= 0 ) {
663
- /* If op2 crosses zero, then floating point values close to zero might be
664
- * possible, which will result in arbitrarily large results. As such, we can't
665
- * do anything useful in that case. */
666
- break ;
667
- }
668
- if (op1_min == ZEND_LONG_MIN && op2_max == -1 ) {
669
- /* Avoid ill-defined division, which may trigger SIGFPE. */
670
- break ;
671
- }
672
-
673
- zend_long t1_ , t2_ , t3_ , t4_ ;
674
- float_div (op1_min , op2_min , & t1 , & t1_ );
675
- float_div (op1_min , op2_max , & t2 , & t2_ );
676
- float_div (op1_max , op2_min , & t3 , & t3_ );
677
- float_div (op1_max , op2_max , & t4 , & t4_ );
678
662
679
- /* The only case in which division can "overflow" either a division by an absolute
680
- * value smaller than one, or LONG_MIN / -1 in particular. Both cases have already
681
- * been excluded above. */
682
- if (OP1_RANGE_UNDERFLOW () ||
683
- OP2_RANGE_UNDERFLOW () ||
684
- OP1_RANGE_OVERFLOW () ||
685
- OP2_RANGE_OVERFLOW ()) {
663
+ /* If op2 crosses zero, then floating point values close to zero might be
664
+ * possible, which will result in arbitrarily large results (overflow). Also
665
+ * avoid dividing LONG_MIN by -1, which is UB. */
666
+ if (OP1_RANGE_UNDERFLOW () || OP2_RANGE_UNDERFLOW () ||
667
+ OP1_RANGE_OVERFLOW () || OP2_RANGE_OVERFLOW () ||
668
+ (op2_min <= 0 && op2_max >= 0 ) ||
669
+ (op1_min == ZEND_LONG_MIN && op2_max == -1 )
670
+ ) {
686
671
tmp -> underflow = 1 ;
687
672
tmp -> overflow = 1 ;
688
673
tmp -> min = ZEND_LONG_MIN ;
689
674
tmp -> max = ZEND_LONG_MAX ;
690
675
} else {
676
+ zend_long t1_ , t2_ , t3_ , t4_ ;
677
+ float_div (op1_min , op2_min , & t1 , & t1_ );
678
+ float_div (op1_min , op2_max , & t2 , & t2_ );
679
+ float_div (op1_max , op2_min , & t3 , & t3_ );
680
+ float_div (op1_max , op2_max , & t4 , & t4_ );
681
+
691
682
tmp -> min = MIN (MIN (MIN (t1 , t2 ), MIN (t3 , t4 )), MIN (MIN (t1_ , t2_ ), MIN (t3_ , t4_ )));
692
683
tmp -> max = MAX (MAX (MAX (t1 , t2 ), MAX (t3 , t4 )), MAX (MAX (t1_ , t2_ ), MAX (t3_ , t4_ )));
693
684
}
0 commit comments