From: Bob Weinand Date: Wed, 1 Jul 2015 22:32:46 +0000 (+0200) Subject: Remove warning upon division by zero X-Git-Tag: php-7.1.0alpha3~25^2~69 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f9724b93f6592d2f77fa9165038a0ba0db3da0c6;p=php Remove warning upon division by zero --- diff --git a/Zend/tests/bug69957.phpt b/Zend/tests/bug69957.phpt index 3653df7d91..7f2c76b918 100644 --- a/Zend/tests/bug69957.phpt +++ b/Zend/tests/bug69957.phpt @@ -61,21 +61,16 @@ try { ?> --EXPECTF-- -Warning: Division by zero in %sbug69957.php on line %d float(INF) Variable mod Type: Exception Message: Division by zero - -Warning: Division by zero in %sbug69957.php on line %d float(INF) Literal mod Type: Exception Message: Division by zero - -Warning: Division by zero in %sbug69957.php on line %d float(INF) Double mod diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 2b90475ba0..7abd978079 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1103,40 +1103,24 @@ ZEND_API int ZEND_FASTCALL div_function(zval *result, zval *op1, zval *op2) /* { while (1) { switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) { case TYPE_PAIR(IS_LONG, IS_LONG): - if (Z_LVAL_P(op2) == 0) { - zend_error(E_WARNING, "Division by zero"); - ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1) / (double) Z_LVAL_P(op2))); - return SUCCESS; - } else if (Z_LVAL_P(op2) == -1 && Z_LVAL_P(op1) == ZEND_LONG_MIN) { - /* Prevent overflow error/crash */ - ZVAL_DOUBLE(result, (double) ZEND_LONG_MIN / -1); + /* prevent crashes (arithmetic exception) */ + if (UNEXPECTED(Z_LVAL_P(op2) == 0 || (Z_LVAL_P(op2) == -1 && Z_LVAL_P(op1) == ZEND_LONG_MIN) || Z_LVAL_P(op1) % Z_LVAL_P(op2) != 0)) { + ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1)) / Z_LVAL_P(op2)); return SUCCESS; - } - if (Z_LVAL_P(op1) % Z_LVAL_P(op2) == 0) { /* integer */ - ZVAL_LONG(result, Z_LVAL_P(op1) / Z_LVAL_P(op2)); } else { - ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1)) / Z_LVAL_P(op2)); + ZVAL_LONG(result, Z_LVAL_P(op1) / Z_LVAL_P(op2)); } return SUCCESS; case TYPE_PAIR(IS_DOUBLE, IS_LONG): - if (Z_LVAL_P(op2) == 0) { - zend_error(E_WARNING, "Division by zero"); - } ZVAL_DOUBLE(result, Z_DVAL_P(op1) / (double)Z_LVAL_P(op2)); return SUCCESS; case TYPE_PAIR(IS_LONG, IS_DOUBLE): - if (Z_DVAL_P(op2) == 0) { - zend_error(E_WARNING, "Division by zero"); - } ZVAL_DOUBLE(result, (double)Z_LVAL_P(op1) / Z_DVAL_P(op2)); return SUCCESS; case TYPE_PAIR(IS_DOUBLE, IS_DOUBLE): - if (Z_DVAL_P(op2) == 0) { - zend_error(E_WARNING, "Division by zero"); - } ZVAL_DOUBLE(result, Z_DVAL_P(op1) / Z_DVAL_P(op2)); return SUCCESS; diff --git a/tests/run-test/test005.phpt b/tests/run-test/test005.phpt index 5dcb650444..1413a198a6 100644 --- a/tests/run-test/test005.phpt +++ b/tests/run-test/test005.phpt @@ -19,8 +19,7 @@ var_dump(ini_get('track_errors')); ini_set('display_errors', 0); var_dump(ini_get('display_errors')); var_dump($php_errormsg); -$zero = 0; -$error = 1 / $zero; +ini_set("zend.assertions", -1); var_dump($php_errormsg); ?> --EXPECTF-- @@ -30,4 +29,4 @@ string(1) "0" string(1) "1" string(1) "0" NULL -string(%d) "%sivision by zer%s" +string(%d) "%senabled or disabled%s" diff --git a/tests/run-test/test006.phpt b/tests/run-test/test006.phpt index 4dca66a4f7..0ab1092a72 100644 --- a/tests/run-test/test006.phpt +++ b/tests/run-test/test006.phpt @@ -3,7 +3,7 @@ Error messages are shown --FILE-- --EXPECTREGEX-- -.*Division by zero.* +.*enabled or disabled.* diff --git a/tests/run-test/test008a.phpt b/tests/run-test/test008a.phpt index ff2a93be0f..954f899aca 100644 --- a/tests/run-test/test008a.phpt +++ b/tests/run-test/test008a.phpt @@ -19,8 +19,7 @@ var_dump(ini_get('track_errors')); ini_set('display_errors', 0); var_dump(ini_get('display_errors')); var_dump($php_errormsg); -$zero = 0; -$error = 1 / $zero; +ini_set('zend.assertions', -1); var_dump($php_errormsg); ?> --EXPECTF-- @@ -30,4 +29,4 @@ string(1) "0" string(1) "1" string(1) "0" NULL -string(%d) "%sivision by zer%s" +string(%d) "%senabled or disabled%s"