mirror of
https://github.com/php/php-src.git
synced 2025-08-16 22:18:50 +02:00
Bugfix#70896 gmp_fact() silently ignores non-integer inputs
Factorials only make sense for integer inputs. To do something factorial-like, the Gamma Function should be used instead. However, at this point it's no longer a factorial. For PHP/GMP, we'll raise a warning on trying to use a non-integer input, but carry on returning the truncated value as we used to (avoiding BC breakage).
This commit is contained in:
parent
256d69cf8a
commit
665050787c
3 changed files with 19 additions and 1 deletions
3
NEWS
3
NEWS
|
@ -2,4 +2,7 @@ PHP NEWS
|
||||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||
?? ??? 2016, PHP 7.2.0alpha1
|
?? ??? 2016, PHP 7.2.0alpha1
|
||||||
|
|
||||||
|
- GMP:
|
||||||
|
. Fixed bug #70896 (gmp_fact() silently ignores non-integer input). (Sara)
|
||||||
|
|
||||||
<<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>
|
<<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>
|
||||||
|
|
|
@ -1365,7 +1365,16 @@ ZEND_FUNCTION(gmp_fact)
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (zval_get_long(a_arg) < 0) {
|
/* Use convert_to_number first to detect getting non-integer */
|
||||||
|
convert_scalar_to_number(a_arg);
|
||||||
|
if (Z_TYPE_P(a_arg) != IS_LONG) {
|
||||||
|
convert_to_long(a_arg);
|
||||||
|
if (Z_LVAL_P(a_arg) >= 0) {
|
||||||
|
/* Only warn if we'll make it past the non-negative check */
|
||||||
|
php_error_docref(NULL, E_WARNING, "Number has to be an integer");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Z_LVAL_P(a_arg) < 0) {
|
||||||
php_error_docref(NULL, E_WARNING, "Number has to be greater than or equal to 0");
|
php_error_docref(NULL, E_WARNING, "Number has to be greater than or equal to 0");
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,8 @@ string(1) "0"
|
||||||
|
|
||||||
Warning: gmp_fact(): Number has to be greater than or equal to 0 in %s on line %d
|
Warning: gmp_fact(): Number has to be greater than or equal to 0 in %s on line %d
|
||||||
string(1) "0"
|
string(1) "0"
|
||||||
|
|
||||||
|
Warning: gmp_fact(): Number has to be an integer in %s on line %d
|
||||||
string(1) "1"
|
string(1) "1"
|
||||||
string(19) "2432902008176640000"
|
string(19) "2432902008176640000"
|
||||||
string(65) "30414093201713378043612608166064768844377641568960512000000000000"
|
string(65) "30414093201713378043612608166064768844377641568960512000000000000"
|
||||||
|
@ -53,9 +55,13 @@ NULL
|
||||||
|
|
||||||
Warning: gmp_fact() expects exactly 1 parameter, 2 given in %s on line %d
|
Warning: gmp_fact() expects exactly 1 parameter, 2 given in %s on line %d
|
||||||
NULL
|
NULL
|
||||||
|
|
||||||
|
Warning: gmp_fact(): Number has to be an integer in %s on line %d
|
||||||
object(GMP)#%d (1) {
|
object(GMP)#%d (1) {
|
||||||
["num"]=>
|
["num"]=>
|
||||||
string(1) "1"
|
string(1) "1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Warning: gmp_fact(): Number has to be an integer in %s on line %d
|
||||||
string(1) "1"
|
string(1) "1"
|
||||||
Done
|
Done
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue