ID: 50970
User updated by: zhangsilly at gmail dot com
Reported By: zhangsilly at gmail dot com
-Status: No Feedback
+Status: Open
Bug Type: Scripting Engine problem
Operating System: Windows XP
PHP Version: 5.2.12
New Comment:
This bug is still exists in the svn version.
Hope you will test this code:
echo '3740925952' + 1; //output 3740925953
echo (int) '3740925952' + 1; // output 2147483648
This bug is unacceptable.
Previous Comments:
------------------------------------------------------------------------
[2010-02-20 01:00:00] php-bugs at lists dot php dot net
No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".
------------------------------------------------------------------------
[2010-02-16 13:53:22] zhangsilly at gmail dot com
To jani:
Your PHP works fine on linux. Is your OS 64bit?
I 'am sure , On Windows 32Bit, both of strtol and atol will truncate
the value.
------------------------------------------------------------------------
[2010-02-16 13:37:20] zhangsilly at gmail dot com
Thanks for your reply. For I am having my spring festeval, now my
computer does'nt have a compiler, I can't test it.
But I do download the source from
http://snaps.php.net/php5.2-latest.tar.gz at 2010-02-16 21:19, chinese
standard time, and check the source , I 'am sure the bug can be
reproduced.
See the file Zend/zend_operators.c, this bug is caused by the
function:
ZEND_API void convert_to_long_base(zval *op, int base)
{
char *strval;
long tmp;
switch (op->type) {
case IS_NULL:
op->value.lval = 0;
break;
case IS_RESOURCE: {
TSRMLS_FETCH();
zend_list_delete(op->value.lval);
}
/* break missing intentionally */
case IS_BOOL:
case IS_LONG:
break;
case IS_DOUBLE:
DVAL_TO_LVAL(op->value.dval, op->value.lval);
break;
case IS_STRING:
strval = op->value.str.val;
op->value.lval = strtol(strval, NULL, base);
STR_FREE(strval);
break;
See the enter point IS_STRING, it use strtol directly. The
truncate was caused by the strtol. If you still use it directly, This
bug will not be fixed.
------------------------------------------------------------------------
[2010-02-12 17:36:08] [email protected]
Please try using this snapshot:
http://snaps.php.net/php5.2-latest.tar.gz
For Windows:
http://windows.php.net/snapshots/
Works fine for me with Linux..
------------------------------------------------------------------------
[2010-02-10 01:48:54] zhangsilly at gmail dot com
this is cause by strtol, used in the ZEND_API convert_to_long_base(zval
*op, int base), which is defined in stdlib.h.
strtol will always return LONG_MAX if the string stands for a
number
which is larger than LONG_MAX.
I'am afraid no matter zend_parse_parameters and convert_to_long,
the
should have the same behavior.
This whill cause a situation that when i pass a string which is
readed from file or socket to long2ip, long2ip($str) is right but
long2ip((int)$str) will be failed.
------------------------------------------------------------------------
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/50970
--
Edit this bug report at http://bugs.php.net/?id=50970&edit=1