Skip to content

Commit 7205c08

Browse files
committed
Improve NAN handling
1 parent 4eb5a1f commit 7205c08

File tree

2 files changed

+40
-8
lines changed

2 files changed

+40
-8
lines changed

ext/standard/math.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,16 @@ PHP_FUNCTION(clamp)
400400
Z_PARAM_ZVAL(zmax)
401401
ZEND_PARSE_PARAMETERS_END();
402402

403+
if (EXPECTED(Z_TYPE_P(zmin) == IS_DOUBLE) && UNEXPECTED(zend_isnan(Z_DVAL_P(zmin)))) {
404+
zend_argument_value_error(2, "cannot be NAN");
405+
RETURN_THROWS();
406+
}
407+
408+
if (EXPECTED(Z_TYPE_P(zmax) == IS_DOUBLE) && UNEXPECTED(zend_isnan(Z_DVAL_P(zmax)))) {
409+
zend_argument_value_error(3, "cannot be NAN");
410+
RETURN_THROWS();
411+
}
412+
403413
if (zend_compare(zmin, zmax) > 0) {
404414
zend_argument_value_error(2, "must be smaller than or equal to argument #3 ($max)");
405415
RETURN_THROWS();
@@ -425,6 +435,16 @@ ZEND_FRAMELESS_FUNCTION(clamp, 3)
425435
Z_FLF_PARAM_ZVAL(2, zmin);
426436
Z_FLF_PARAM_ZVAL(3, zmax);
427437

438+
if (EXPECTED(Z_TYPE_P(zmin) == IS_DOUBLE) && UNEXPECTED(zend_isnan(Z_DVAL_P(zmin)))) {
439+
zend_argument_value_error(2, "cannot be NAN");
440+
RETURN_THROWS();
441+
}
442+
443+
if (EXPECTED(Z_TYPE_P(zmax) == IS_DOUBLE) && UNEXPECTED(zend_isnan(Z_DVAL_P(zmax)))) {
444+
zend_argument_value_error(3, "cannot be NAN");
445+
RETURN_THROWS();
446+
}
447+
428448
if (zend_compare(zmin, zmax) > 0) {
429449
zend_argument_value_error(2, "must be smaller than or equal to argument #3 ($max)");
430450
RETURN_THROWS();

ext/standard/tests/math/clamp.phpt

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,30 @@ var_dump(clamp(2.5, 1.3, 3.4));
1515
var_dump(clamp(0, 1.3, 3.4));
1616
var_dump(clamp(M_PI, -INF, INF));
1717
var_dump(clamp(NAN, 4, 6));
18-
var_dump(clamp(4, NAN, 6));
19-
var_dump(clamp(8, NAN, 6));
20-
var_dump(clamp(7, 6, NAN));
21-
var_dump(clamp(4, 6, NAN));
2218
var_dump(clamp("a", "c", "g"));
2319
var_dump(clamp("d", "c", "g"));
2420
echo clamp('2025-08-01', '2025-08-15', '2025-09-15'), "\n";
2521
echo clamp('2025-08-20', '2025-08-15', '2025-09-15'), "\n";
2622
echo clamp(new \DateTimeImmutable('2025-08-01'), new \DateTimeImmutable('2025-08-15'), new \DateTimeImmutable('2025-09-15'))->format('Y-m-d'), "\n";
2723
echo clamp(new \DateTimeImmutable('2025-08-20'), new \DateTimeImmutable('2025-08-15'), new \DateTimeImmutable('2025-09-15'))->format('Y-m-d'), "\n";
2824

25+
try {
26+
var_dump(clamp(4, NAN, 6));
27+
} catch (ValueError $error) {
28+
echo $error->getMessage(), "\n";
29+
}
30+
31+
try {
32+
var_dump(clamp(7, 6, NAN));
33+
} catch (ValueError $error) {
34+
echo $error->getMessage(), "\n";
35+
}
36+
37+
try {
38+
var_dump(clamp(1, 3, 2));
39+
} catch (ValueError $error) {
40+
echo $error->getMessage(), "\n";
41+
}
2942
?>
3043
--EXPECT--
3144
int(2)
@@ -37,13 +50,12 @@ float(2.5)
3750
float(1.3)
3851
float(3.141592653589793)
3952
double(NAN)
40-
int(4)
41-
int(6)
42-
int(7)
43-
int(6)
4453
string(1) "c"
4554
string(1) "d"
4655
2025-08-15
4756
2025-08-20
4857
2025-08-15
4958
2025-08-20
59+
Argument #2 ($min) cannot be NAN
60+
Argument #3 ($max) cannot be NAN
61+
Argument #2 ($min) must be smaller than or equal to argument #3 ($max)

0 commit comments

Comments
 (0)