Bug #78513 [Opn]: compact('0') (any int) will generate an array with inaccessible key

From: Date: Mon, 19 Jul 2021 13:16:06 +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-235180@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: cmb@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: Also, the fix would introduce a BC break: <https://3v4l.org/CnQhfT>. Previous Comments: ------------------------------------------------------------------------ [2019-09-09 07:58:20] nikic@php.net 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 ------------------------------------------------------------------------ [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

« previous php.bugs (#235180) next »