ID: 49244
Updated by: [email protected]
Reported By: ronlentjes at yahoo dot com dot au
Status: Verified
Bug Type: Scripting Engine problem
Operating System: Linux Fedora 8
PHP Version: 5.3.0
New Comment:
I can't commit things. Somebody with SVN access should apply my patch
and commit it. I've improved some things and added a testcase:
Index: ext/standard/formatted_print.c
===================================================================
--- ext/standard/formatted_print.c (revision 288201)
+++ ext/standard/formatted_print.c (working copy)
@@ -42,6 +42,8 @@
#define FLOAT_PRECISION 6
#define MAX_FLOAT_DIGITS 38
#define MAX_FLOAT_PRECISION 40
+#define NOT_A_NUMBER "NaN"
+#define INFINITE "INF"
#if 0
/* trick to control varargs functions through cpp */
@@ -231,15 +233,15 @@
if (zend_isnan(number)) {
is_negative = (number<0);
- php_sprintf_appendstring(buffer, pos, size, "NaN", 3, 0,
padding,
- alignment,
precision, is_negative, 0, always_sign);
+ php_sprintf_appendstring(buffer, pos, size, NOT_A_NUMBER,
strlen(NOT_A_NUMBER), 0, padding,
+ alignment, strlen(NOT_A_NUMBER),
is_negative, 0, always_sign);
return;
}
if (zend_isinf(number)) {
is_negative = (number<0);
- php_sprintf_appendstring(buffer, pos, size, "INF", 3, 0,
padding,
- alignment,
precision, is_negative, 0, always_sign);
+ php_sprintf_appendstring(buffer, pos, size, INFINITE,
strlen(INFINITE), 0, padding,
+ alignment, strlen(INFINITE),
is_negative, 0, always_sign);
return;
}
Index: ext/standard/tests/strings/bug49244.phpt
===================================================================
--- ext/standard/tests/strings/bug49244.phpt (revision 0)
+++ ext/standard/tests/strings/bug49244.phpt (revision 0)
@@ -0,0 +1,8 @@
+--TEST--
+Bug #49244 (Floating point NaN cause garbage characters)
+--FILE--
+<?php
+printf("%f\n", pow(-1.0, 0.3));
+?>
+--EXPECT--
+NaN
Previous Comments:
------------------------------------------------------------------------
[2009-09-01 16:34:22] [email protected]
sjoerd -- That fix works fine for me.
Can you commit that?
------------------------------------------------------------------------
[2009-08-20 19:19:13] sjoerd-php at linuxonly dot nl
The problem is with calling php_sprintf_appendstring. Its 9th parameter
is not precision, it is length.
Index: ext/standard/formatted_print.c
===================================================================
--- ext/standard/formatted_print.c (revision 287513)
+++ ext/standard/formatted_print.c (working copy)
@@ -232,14 +232,14 @@
if (zend_isnan(number)) {
is_negative = (number<0);
php_sprintf_appendstring(buffer, pos, size, "NaN", 3, 0,
padding,
- alignment,
precision, is_negative, 0, always_sign);
+ alignment, 3,
is_negative, 0, always_sign);
return;
}
if (zend_isinf(number)) {
is_negative = (number<0);
php_sprintf_appendstring(buffer, pos, size, "INF", 3, 0,
padding,
- alignment,
precision, is_negative, 0, always_sign);
+ alignment, 3,
is_negative, 0, always_sign);
return;
}
------------------------------------------------------------------------
[2009-08-20 11:15:47] sjoerd-php at linuxonly dot nl
Could reproduce with PHP 5.2.10.
------------------------------------------------------------------------
[2009-08-14 04:25:22] ronlentjes at yahoo dot com dot au
Perhaps you test it differently than I do. I'll give you the easiest
way to see it happen:
put this in a file called test.php:
---
<?
$d = pow(-1.0, 0.3);
printf ("%f\n", $d);
?>
---
Output will be (bash, Fedora 8, Linux):
# php test.php
---
NaN*A
---
Output for browser will be NaN??? or NaN???F or other variations of
that.
This is reporducable on versions 4.2.2 (crash), 5.2.4, 5.3.0 (as
indicated previously).
I just retried this now.
Cheers,
Ron Lentjes
LC CLS.
------------------------------------------------------------------------
[2009-08-13 14:29:39] [email protected]
I am unable to reproduce this in neither 5.2 nor 5.3, and Valgrind is
clean on Debian.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/49244
--
Edit this bug report at http://bugs.php.net/?id=49244&edit=1