diff options
author | George Peter Banyard <girgias@php.net> | 2020-09-13 00:43:00 +0200 |
---|---|---|
committer | George Peter Banyard <girgias@php.net> | 2020-09-14 13:40:07 +0200 |
commit | 31ef94cd4223718dafb2334c8b46db54b7f24a82 (patch) | |
tree | 97b033d80e4379d68f83134ccc2273632da2b0dc /Zend/zend_operators.c | |
parent | bf515649ff7840f7180b02b04ada8bc8587c70c6 (diff) | |
download | php-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.c | 19 |
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; } /* }}} */ |