Bug #78513 [Opn]: compact('0') (any int) will generate an array with inaccessible key
| From: | nikic@php.net | Date: | Mon, 09 Sep 2019 07:58:21 +0000 |
| Subject: | Bug #78513 [Opn]: compact('0') (any int) will generate an array with inaccessible key | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-222634@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=78513&edit=1
ID: 78513
Updated by: nikic@php.net
Reported by: tandre@php.net
Summary: compact('0') (any int) will generate an array with
inaccessible key
Status: Open
Type: Bug
Package: Arrays related
Operating System: Linux/Any
PHP Version: Irrelevant
Block user comment: N
Private report: N
New Comment:
There's a larger underlying issue here:
${0} = 'value';
var_dump($GLOBALS[0]); // Notice: Undefined offset: 0
Only works on HHVM an PHP < 5.0.
Same for the other way around:
$GLOBALS[0] = 'value';
var_dump(${0}); // Notice: Undefined variable: 0
Previous Comments:
------------------------------------------------------------------------
[2019-09-08 18:51:14] tandre@php.net
Description:
------------
compact('0') (or any other number) will generate an array with inaccessible keys if a
variable with that value is defined.
I can't think of any reason to actually do this in real code, but I'd also expect all
functions to return arrays with accessible keys.
Note that ext/opcache/Optimizer/zend_func_info.c may need to be changed depending on how this is
fixed, to add MAY_BE_ARRAY_KEY_LONG.
F1("compact", MAY_BE_NULL | MAY_BE_ARRAY |
MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
I'd suggest limiting the fix to development php versions(php 7.4/8.0).
https://bugs.php.net/bug.php?id=61655 was a
similar issue with inaccessible array keys, but had a different cause (casting object to array)
Test script:
---------------
<?php
call_user_func(function () {
${0} = 'value';
$result = compact('0');
var_export($result);
var_export($result[0]);
});
Expected result:
----------------
Should emit the following output, with an integer array key (0, not '0') that can be
accessed.
array(
0 => 'value'
)'value'
Alternatively, it could throw/return an error value.
Actual result:
--------------
php test.php
array (
'0' => 'value',
)Notice: Undefined offset: 0 in /home/tyson/test.php on line 6
NULL
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=78513&edit=1