#50970 [NoF->Opn]: force convert a string into int using (int) or intval() cause value truncate

From: Date: Sun, 21 Feb 2010 01:32:41 +0000
Subject: #50970 [NoF->Opn]: force convert a string into int using (int) or intval() cause value truncate
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-147912@lists.php.net to get a copy of this message
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] jani@php.net 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

« previous php.bugs (#147912) next »