summaryrefslogtreecommitdiff
path: root/Zend/zend_operators.c
diff options
context:
space:
mode:
authorGeorge Peter Banyard <girgias@php.net>2020-09-13 00:43:00 +0200
committerGeorge Peter Banyard <girgias@php.net>2020-09-14 13:40:07 +0200
commit31ef94cd4223718dafb2334c8b46db54b7f24a82 (patch)
tree97b033d80e4379d68f83134ccc2273632da2b0dc /Zend/zend_operators.c
parentbf515649ff7840f7180b02b04ada8bc8587c70c6 (diff)
downloadphp-git-31ef94cd4223718dafb2334c8b46db54b7f24a82.tar.gz
Convert Division by 0 warnings to Error per the Engine Warning RFC
Closes GH-6125
Diffstat (limited to 'Zend/zend_operators.c')
-rw-r--r--Zend/zend_operators.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index e126f784cf..0923741723 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -1253,18 +1253,13 @@ ZEND_API zend_result ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *o
}
/* }}} */
-#ifdef __clang__
-__attribute__((no_sanitize("float-divide-by-zero")))
-#endif
static zend_result ZEND_FASTCALL div_function_base(zval *result, zval *op1, zval *op2) /* {{{ */
{
zend_uchar type_pair = TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2));
if (EXPECTED(type_pair == 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;
+ goto division_by_0;
} 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);
@@ -1278,25 +1273,31 @@ static zend_result ZEND_FASTCALL div_function_base(zval *result, zval *op1, zval
return SUCCESS;
} else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_DOUBLE))) {
if (Z_DVAL_P(op2) == 0) {
- zend_error(E_WARNING, "Division by zero");
+ goto division_by_0;
}
ZVAL_DOUBLE(result, Z_DVAL_P(op1) / Z_DVAL_P(op2));
return SUCCESS;
} else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_LONG))) {
if (Z_LVAL_P(op2) == 0) {
- zend_error(E_WARNING, "Division by zero");
+ goto division_by_0;
}
ZVAL_DOUBLE(result, Z_DVAL_P(op1) / (double)Z_LVAL_P(op2));
return SUCCESS;
} else if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_DOUBLE))) {
if (Z_DVAL_P(op2) == 0) {
- zend_error(E_WARNING, "Division by zero");
+ goto division_by_0;
}
ZVAL_DOUBLE(result, (double)Z_LVAL_P(op1) / Z_DVAL_P(op2));
return SUCCESS;
} else {
return FAILURE;
}
+division_by_0:
+ if (result != op1) {
+ ZVAL_UNDEF(result);
+ }
+ zend_throw_error(zend_ce_division_by_zero_error, "Division by zero");
+ return SUCCESS;
}
/* }}} */