|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2004-06-15 22:26 UTC] pmichaud at pobox dot com
Description:
------------
PHP seems to incorrectly convert strings beginning with "inf" to INF (infinity). This includes converting strings such as "info" and "inflammable". Surprisingly, the strings "inf" and "infinity" do *not* convert to infinity but correctly become zeros. A script that illustrates the problem is given below:
This is very annoying because one cannot simply do a test for a positive number with code such as
if ($x>0) { echo "$x is positive"; }
because if $x is any string beginning with "inf" (but not "inf" or "infinity") it is treated as a positive number.
Pm
Reproduce code:
---------------
Here's a script that illustrates the problem:
<?php
header("Content-type: text/plain");
$a = "into";
$b = "info";
$c = "inf";
$d = "infinity";
$e = "infin";
$f = "inflammable";
echo "a: $a == ",$a+0,"\n"; # outputs 0 (correct)
echo "b: $b == ",$b+0,"\n"; # outputs INF, incorrect!
echo "c: $c == ",$c+0,"\n"; # outputs 0 (?!)
echo "d: $d == ",$d+0,"\n"; # outputs 0 (?!)
echo "e: $e == ",$e+0,"\n"; # outputs INF, incorrect!
echo "f: $f == ",$f+0,"\n"; # outputs INF, incorrect!
?>
Expected result:
----------------
a: into == 0
b: info == 0
c: inf == 0
d: infinity == 0
e: infin == 0
f: inflammable == 0
Actual result:
--------------
a: into == 0
b: info == INF
c: inf == 0
d: infinity == 0
e: infin == INF
f: inflammable == INF
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 13:00:02 2025 UTC |
Verified that this is indeed the case. Since we are using strtol() internally here, I would actually expect INF for both your "inf" and "infinity" cases. The strtol() spec says that this should be the result. And a quick local check verifies this, but the others definitely shouldn't be returning INF. It looks like we are not checking the end pointer returned from strtol() at all in any of our conversion functions. We need something like this: l = strtol(s, &endp, 0); if (s != endp && *endp == `\0') { ... valid conversion ... }