#50970 [Com]: force convert a string into int using (int) or intval() cause value truncate

From: Date: Tue, 16 Feb 2010 13:37:20 +0000
Subject: #50970 [Com]: 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-147704@lists.php.net to get a copy of this message
ID: 50970 Comment by: zhangsilly at gmail dot com Reported By: zhangsilly at gmail dot com Status: Feedback Bug Type: Scripting Engine problem Operating System: Windows XP PHP Version: 5.2.12 New Comment: 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. Previous Comments: ------------------------------------------------------------------------ [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. ------------------------------------------------------------------------ [2010-02-09 01:29:31] zhangsilly at gmail dot com Description: ------------ use (int) or intval() to convert a string into integer in userland, if bigger than 2147483647, this will result a truncate, the value will always be 2147483647. but use zend_parse_parameters to parse the string as a long arguement, is do give the correct value in nagtive format Reproduce code: --------------- /** * assert failure * (int)3740925952 result is -554041344 * (int)'3740925952' result is 2147483647 */ assert((int)3740925952 == (int)'3740925952'); Expected result: ---------------- assert should be succeed Actual result: -------------- assert failure ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=50970&edit=1

« previous php.bugs (#147704) next »