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