From: Anatol Belski Date: Sun, 5 Jul 2015 18:18:17 +0000 (+0200) Subject: bring back the division by zero warning X-Git-Tag: php-7.0.0beta1~12^2~48 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a97f7644725fab6a6c3681b3062f40994a218cb6;p=php bring back the division by zero warning --- diff --git a/Zend/tests/bug69957.phpt b/Zend/tests/bug69957.phpt index d8d3a6f1fc..d578f9c8d2 100644 --- a/Zend/tests/bug69957.phpt +++ b/Zend/tests/bug69957.phpt @@ -61,16 +61,21 @@ try { ?> --EXPECTF-- +Warning: Division by zero in %sbug69957.php on line %d float(INF) Variable mod Type: DivisionByZeroError Message: Modulo by zero + +Warning: Division by zero in %sbug69957.php on line %d float(INF) Literal mod Type: DivisionByZeroError Message: Modulo by zero + +Warning: Division by zero in %sbug69957.php on line %d float(INF) Double mod diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 2d41f3fda6..02c79fbafc 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5637,9 +5637,11 @@ static inline zend_bool zend_try_ct_eval_binary_op(zval *result, uint32_t opcode binary_op_type fn = get_binary_op(opcode); /* don't evaluate division by zero at compile-time */ - if (opcode == ZEND_MOD && zval_get_long(op2) == 0) { + if ((opcode == ZEND_DIV || opcode == ZEND_MOD) && + zval_get_long(op2) == 0) { return 0; - } else if ((opcode == ZEND_SL || opcode == ZEND_SR) && zval_get_long(op2) < 0) { + } else if ((opcode == ZEND_SL || opcode == ZEND_SR) && + zval_get_long(op2) < 0) { return 0; } diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 353be83afc..8226cec9fe 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1111,24 +1111,40 @@ 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): - /* 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)); + 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 { + } 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); + 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)); } 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 1413a198a6..5dcb650444 100644 --- a/tests/run-test/test005.phpt +++ b/tests/run-test/test005.phpt @@ -19,7 +19,8 @@ var_dump(ini_get('track_errors')); ini_set('display_errors', 0); var_dump(ini_get('display_errors')); var_dump($php_errormsg); -ini_set("zend.assertions", -1); +$zero = 0; +$error = 1 / $zero; var_dump($php_errormsg); ?> --EXPECTF-- @@ -29,4 +30,4 @@ string(1) "0" string(1) "1" string(1) "0" NULL -string(%d) "%senabled or disabled%s" +string(%d) "%sivision by zer%s" diff --git a/tests/run-test/test006.phpt b/tests/run-test/test006.phpt index 0ab1092a72..4dca66a4f7 100644 --- a/tests/run-test/test006.phpt +++ b/tests/run-test/test006.phpt @@ -3,7 +3,7 @@ Error messages are shown --FILE-- --EXPECTREGEX-- -.*enabled or disabled.* +.*Division by zero.* diff --git a/tests/run-test/test008a.phpt b/tests/run-test/test008a.phpt index 954f899aca..ff2a93be0f 100644 --- a/tests/run-test/test008a.phpt +++ b/tests/run-test/test008a.phpt @@ -19,7 +19,8 @@ var_dump(ini_get('track_errors')); ini_set('display_errors', 0); var_dump(ini_get('display_errors')); var_dump($php_errormsg); -ini_set('zend.assertions', -1); +$zero = 0; +$error = 1 / $zero; var_dump($php_errormsg); ?> --EXPECTF-- @@ -29,4 +30,4 @@ string(1) "0" string(1) "1" string(1) "0" NULL -string(%d) "%senabled or disabled%s" +string(%d) "%sivision by zer%s"