ID: 21182
Updated by: [EMAIL PROTECTED]
Reported By: [EMAIL PROTECTED]
-Status: Open
+Status: Critical
Bug Type: Arrays related
Operating System: FreeBSD
-PHP Version: 4.2.1
+PHP Version: 4.3.0-dev
New Comment:
Confirmed in 4.3.0. If they are strings, $a turns into 40! If $a is
integer, it stays 20 as expected. Btw if we have '$a = "$a = "24"; $b
= "140";' then $a turns into 04. There seems to be sort of a pattern
but it's kinda weird :) The second argument ($b) does not get modified
and the following behavoir exists:
range(20, "30"); // okay in 4.3.0-dev
range("20", "30"); // not okay in 4.3.0-dev
And as a holiday bonus, in HEAD either use results in a segfault with
the following backtrace for CLI:
rock:/tmp# php range.php
a1: 20
FATAL: erealloc(): Unable to allocate 1515870815 bytes
Segmentation fault (core dumped)
#0 0x400b9c51 in kill () from /lib/libc.so.6
#1 0x0815f28c in _erealloc (ptr=0x8360cdc, size=1515870815,
allow_failure=0, __zend_filename=0x81b8100
"/cvs/php4/Zend/zend_operators.c", __zend_lineno=1013,
__zend_orig_filename=0x0, __zend_orig_lineno=0)
at /cvs/php4/Zend/zend_alloc.c:298
#2 0x0816fb47 in add_string_to_string (result=0xbfffd5f4,
op1=0xbfffd5f4, op2=0xbfffd748) at
/cvs/php4/Zend/zend_operators.c:1013
#3 0x0818766b in execute (op_array=0x83677c4) at
/cvs/php4/Zend/zend_execute.c:1463
#4 0x08174924 in zend_execute_scripts (type=8, retval=0x0,
file_count=3) at /cvs/php4/Zend/zend.c:931
#5 0x08139553 in php_execute_script (primary_file=0xbffffa2c) at
/cvs/php4/main/main.c:1693
#6 0x0818e817 in main (argc=2, argv=0xbffffaa4) at
/cvs/php4/sapi/cli/php_cli.c:744
range.php looks like this:
<?php
$a = "20"; $b = "30";
echo "a1: $a\n";
$result = range($a, $b);
echo "a2: $a : type : " . gettype($a) . "\n";
?>
Previous Comments:
------------------------------------------------------------------------
[2002-12-25 10:43:54] [EMAIL PROTECTED]
I searched range's source (php4/ext/standard/array.c)
It seems that problem is in string
for (; *low <= *high; (*low) += (unsigned int)lstep) {
add_next_index_stringl(return_value, low, 1, 1);
}
+= increments not pointer, but value, to which low points.
Therefore for(;;) iterates values between first characters of high and
low strings.
------------------------------------------------------------------------
[2002-12-25 10:02:09] [EMAIL PROTECTED]
I have the following code:
<?PHP
$a = "20";
$b = "30";
$result = range($a, $b);
echo $a;
?>
For some reason it display "40".
I know that I have to write
$result = range((int)$a, (int)$b);
But why range() change value of argument?
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=21182&edit=1