summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2019-10-28 11:59:20 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2019-10-28 12:22:31 +0100
commit84f2a984d405460a865faefca3298589c79f4d05 (patch)
tree98fb58b95881e99677514baf7917d60d90a48ecf
parent82dc9a31c335d8cf7aff68d76698bc3d24f761f8 (diff)
downloadphp-git-84f2a984d405460a865faefca3298589c79f4d05.tar.gz
Elevate warnings to Error Exceptions in ext/bcmath
`bcdiv()` and `bcmod()` throw DivisionByZeroError if the divisor is 0, which matches the behavior of the `/` and `%` operators, and `bcsqrt()` throws ValueError for negative operands.
-rw-r--r--ext/bcmath/bcmath.c7
-rw-r--r--ext/bcmath/bcmath.stub.php6
-rw-r--r--ext/bcmath/bcmath_arginfo.h4
-rw-r--r--ext/bcmath/tests/bcdiv_error1.phpt10
-rw-r--r--ext/bcmath/tests/bcmod_error2.phpt10
-rw-r--r--ext/bcmath/tests/bcsqrt_error1.phpt10
6 files changed, 30 insertions, 17 deletions
diff --git a/ext/bcmath/bcmath.c b/ext/bcmath/bcmath.c
index f528922752..5d0d47f7c0 100644
--- a/ext/bcmath/bcmath.c
+++ b/ext/bcmath/bcmath.c
@@ -23,6 +23,7 @@
#if HAVE_BCMATH
#include "php_ini.h"
+#include "zend_exceptions.h"
#include "bcmath_arginfo.h"
#include "ext/standard/info.h"
#include "php_bcmath.h"
@@ -284,7 +285,7 @@ PHP_FUNCTION(bcdiv)
RETVAL_STR(bc_num2str_ex(result, scale));
break;
case -1: /* division by zero */
- php_error_docref(NULL, E_WARNING, "Division by zero");
+ zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero");
break;
}
@@ -326,7 +327,7 @@ PHP_FUNCTION(bcmod)
RETVAL_STR(bc_num2str_ex(result, scale));
break;
case -1:
- php_error_docref(NULL, E_WARNING, "Division by zero");
+ zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Modulo by zero");
break;
}
@@ -438,7 +439,7 @@ PHP_FUNCTION(bcsqrt)
if (bc_sqrt (&result, scale) != 0) {
RETVAL_STR(bc_num2str_ex(result, scale));
} else {
- php_error_docref(NULL, E_WARNING, "Square root of negative number");
+ zend_value_error("Square root of negative number");
}
bc_free_num(&result);
diff --git a/ext/bcmath/bcmath.stub.php b/ext/bcmath/bcmath.stub.php
index b5d1816acc..274759b8a6 100644
--- a/ext/bcmath/bcmath.stub.php
+++ b/ext/bcmath/bcmath.stub.php
@@ -6,16 +6,16 @@ function bcsub(string $left_operand, string $right_operand, int $scale = UNKNOWN
function bcmul(string $left_operand, string $right_operand, int $scale = UNKNOWN) : string {}
-function bcdiv(string $dividend, string $divisor, int $scale = UNKNOWN) : ?string {}
+function bcdiv(string $dividend, string $divisor, int $scale = UNKNOWN) : string {}
-function bcmod(string $dividend, string $divisor, int $scale = UNKNOWN) : ?string {}
+function bcmod(string $dividend, string $divisor, int $scale = UNKNOWN) : string {}
/** @return string|false */
function bcpowmod(string $base, string $exponent, string $modulus, int $scale = UNKNOWN) {}
function bcpow(string $base, string $exponent, int $scale = UNKNOWN) : string {}
-function bcsqrt(string $operand, int $scale = UNKNOWN) : ?string {}
+function bcsqrt(string $operand, int $scale = UNKNOWN) : string {}
function bccomp(string $left_operand, string $right_operand, int $scale = UNKNOWN) : int {}
diff --git a/ext/bcmath/bcmath_arginfo.h b/ext/bcmath/bcmath_arginfo.h
index 6c0b1061f2..2d2117acaa 100644
--- a/ext/bcmath/bcmath_arginfo.h
+++ b/ext/bcmath/bcmath_arginfo.h
@@ -10,7 +10,7 @@ ZEND_END_ARG_INFO()
#define arginfo_bcmul arginfo_bcadd
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcdiv, 0, 2, IS_STRING, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcdiv, 0, 2, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, dividend, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, divisor, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, scale, IS_LONG, 0)
@@ -31,7 +31,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcpow, 0, 2, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, scale, IS_LONG, 0)
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcsqrt, 0, 1, IS_STRING, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcsqrt, 0, 1, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, operand, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, scale, IS_LONG, 0)
ZEND_END_ARG_INFO()
diff --git a/ext/bcmath/tests/bcdiv_error1.phpt b/ext/bcmath/tests/bcdiv_error1.phpt
index c69d36bb9c..a89ae98cfb 100644
--- a/ext/bcmath/tests/bcdiv_error1.phpt
+++ b/ext/bcmath/tests/bcdiv_error1.phpt
@@ -8,7 +8,11 @@ antoni@solucionsinternet.com
<?php if(!extension_loaded("bcmath")) print "skip"; ?>
--FILE--
<?php
-echo bcdiv('10.99', '0');
+try {
+ bcdiv('10.99', '0');
+} catch (DivisionByZeroError $ex) {
+ echo $ex->getMessage(), PHP_EOL;
+}
?>
---EXPECTF--
-Warning: bcdiv(): Division by zero in %s.php on line %d
+--EXPECT--
+Division by zero
diff --git a/ext/bcmath/tests/bcmod_error2.phpt b/ext/bcmath/tests/bcmod_error2.phpt
index 714615d7d1..c4d49486b3 100644
--- a/ext/bcmath/tests/bcmod_error2.phpt
+++ b/ext/bcmath/tests/bcmod_error2.phpt
@@ -6,7 +6,11 @@ bcmod() - mod by 0
bcmath.scale=0
--FILE--
<?php
-echo bcmod("10", "0");
+try {
+ bcmod("10", "0");
+} catch (DivisionByZeroError $ex) {
+ echo $ex->getMessage(), PHP_EOL;
+}
?>
---EXPECTF--
-Warning: bcmod(): Division by zero in %s on line %d
+--EXPECT--
+Modulo by zero
diff --git a/ext/bcmath/tests/bcsqrt_error1.phpt b/ext/bcmath/tests/bcsqrt_error1.phpt
index 1f213dbc82..bbc69f3952 100644
--- a/ext/bcmath/tests/bcsqrt_error1.phpt
+++ b/ext/bcmath/tests/bcsqrt_error1.phpt
@@ -7,7 +7,11 @@ antoni@solucionsinternet.com
<?php if(!extension_loaded("bcmath")) print "skip"; ?>
--FILE--
<?php
-echo bcsqrt('-9');
+try {
+ bcsqrt('-9');
+} catch (ValueError $ex) {
+ echo $ex->getMessage(), PHP_EOL;
+}
?>
---EXPECTF--
-Warning: bcsqrt(): Square root of negative number in %s.php on line %d
+--EXPECT--
+Square root of negative number