php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #60362 non-existent sub-sub keys should not have values
Submitted: 2011-11-23 01:37 UTC Modified: 2011-12-19 02:10 UTC
From: danielc at analysisandsolutions dot com Assigned: stas (profile)
Status: Closed Package: Arrays related
PHP Version: 5.4SVN-2011-11-23 (SVN) OS: linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: danielc at analysisandsolutions dot com
New email:
PHP Version: OS:

 

 [2011-11-23 01:37 UTC] danielc at analysisandsolutions dot com
Description:
------------
In an array, a sub-sub-key of an existing key is now returning a letter of the value indexed by the main key.  This is a regression in 5.4.  PHP 5.3 still operates as expected.  I suspect this is related to the array dereferencing changes.

Test script:
---------------
$arr = array('exists' => 'foo');

if (isset($arr['exists']['non_existent'])) {
    echo "expected: sub-key 'non_existent' is set: ";
    var_dump($arr['exists']['non_existent']);
} else {
    echo "BEHAVIOR CHANGED: sub-key 'non_existent' is not set.\n";
}
if (isset($arr['exists'][1])) {
    echo "expected: sub-key 1 is set: ";
    var_dump($arr['exists'][1]);
} else {
    echo "BEHAVIOR CHANGED: sub-key 1 is not set.\n";
}

echo "-------------------\n";
if (isset($arr['exists']['non_existent']['sub_sub'])) {
    echo "BEHAVIOR CHANGED: sub-key 'sub_sub' is set: ";
    var_dump($arr['exists']['non_existent']['sub_sub']);
} else {
    echo "good: sub-sub-key 'sub_sub' is not set.\n";
}
if (isset($arr['exists'][1][0])) {
    echo "BEHAVIOR CHANGED: sub-sub-key 0 is set: ";
    var_dump($arr['exists'][1][0]);
} else {
    echo "good: sub-sub-key 0 is not set.\n";
}

echo "-------------------\n";
if (empty($arr['exists']['non_existent'])) {
    echo "BEHAVIOR CHANGED: sub-key 'non_existent' is empty.\n";
} else {
    echo "expected: sub-key 'non_existent' is not empty: ";
    var_dump($arr['exists']['non_existent']);
}
if (empty($arr['exists'][1])) {
    echo "BEHAVIOR CHANGED: sub-key 1 is empty.\n";
} else {
    echo "expected: sub-key 1 is NOT empty: ";
    var_dump($arr['exists'][1]);
}

echo "-------------------\n";
if (empty($arr['exists']['non_existent']['sub_sub'])) {
    echo "good: sub-sub-key 'sub_sub' is empty.\n";
} else {
    echo "BEHAVIOR CHANGED: sub-sub-key 'sub_sub' is not empty: ";
    var_dump($arr['exists']['non_existent']['sub_sub']);
}
if (empty($arr['exists'][1][0])) {
    echo "good: sub-sub-key 0 is empty.\n";
} else {
    echo "BEHAVIOR CHANGED: sub-sub-key 0 is not empty: ";
    var_dump($arr['exists'][1][0]);
}


Expected result:
----------------
expected: sub-key 'non_existent' is set: string(1) "f"
expected: sub-key 1 is set: string(1) "o"
-------------------
good: sub-sub-key 'sub_sub' is not set.
good: sub-sub-key 0 is not set.
-------------------
expected: sub-key 'non_existent' is not empty: string(1) "f"
expected: sub-key 1 is NOT empty: string(1) "o"
-------------------
good: sub-sub-key 'sub_sub' is empty.
good: sub-sub-key 0 is empty.


Actual result:
--------------
expected: sub-key 'non_existent' is set: string(1) "f"
expected: sub-key 1 is set: string(1) "o"
-------------------
BEHAVIOR CHANGED: sub-key 'sub_sub' is set: string(1) "f"
BEHAVIOR CHANGED: sub-sub-key 0 is set: string(1) "o"
-------------------
expected: sub-key 'non_existent' is not empty: string(1) "f"
expected: sub-key 1 is NOT empty: string(1) "o"
-------------------
BEHAVIOR CHANGED: sub-sub-key 'sub_sub' is not empty: string(1) "f"
BEHAVIOR CHANGED: sub-sub-key 0 is not empty: string(1) "o"


Patches

fix_to_prevent_warning_on_isset_empty_for_55_and_a_half.patch (last revision 2011-12-21 14:34 UTC by alan_k@php.net)
isset_changed_warning_only_on_access.patch (last revision 2011-12-18 05:08 UTC by alan_k@php.net)
string_offset_trigger_notice.patch (last revision 2011-12-05 05:17 UTC by laruence@php.net)
fix_disabling_bad_string_offsets (last revision 2011-12-04 16:43 UTC by laruence@php.net)
first_effort_to_fix_this (last revision 2011-12-03 15:51 UTC by alan at akbkhome dot com)
bug60362.sub-sub-keys.phpt (last revision 2011-11-23 01:40 UTC by danielc at analysisandsolutions dot com)

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2011-12-04 12:52 UTC] alan at akbkhome dot com
This is the test output after the changes:
- most of this makes sense - string offsets of strings are now invalid, and the dereferencing of strings with numerical indexes is 'fixed' and a behaviour change.

BEHAVIOR CHANGED: sub-key 'non_existent' is not set.
expected: sub-key 1 is set: string(1) "o"
-------------------
good: sub-sub-key 'sub_sub' is not set.
BEHAVIOR CHANGED: sub-sub-key 0 is set: string(1) "o"
-------------------
BEHAVIOR CHANGED: sub-key 'non_existent' is empty.
expected: sub-key 1 is NOT empty: string(1) "o"
-------------------
good: sub-sub-key 'sub_sub' is empty.
BEHAVIOR CHANGED: sub-sub-key 0 is not empty: string(1) "o"
 [2011-12-04 16:43 UTC] laruence@php.net
The following patch has been added/updated:

Patch Name: fix_disabling_bad_string_offsets
Revision:   1323016981
URL:        https://bugs.php.net/patch-display.php?bug=60362&patch=fix_disabling_bad_string_offsets&revision=1323016981
 [2011-12-04 16:43 UTC] laruence@php.net
update patch, only change the code style, and fix one test faild, thanks
 [2011-12-04 17:26 UTC] laruence@php.net
The following patch has been added/updated:

Patch Name: string_offset_trigger_notice.patch
Revision:   1323019601
URL:        https://bugs.php.net/patch-display.php?bug=60362&patch=string_offset_trigger_notice.patch&revision=1323019601
 [2011-12-04 17:27 UTC] laruence@php.net
submit a new patch, which only trigger notice when string offset cast occurred.
 [2011-12-05 05:17 UTC] laruence@php.net
The following patch has been added/updated:

Patch Name: string_offset_trigger_notice.patch
Revision:   1323062240
URL:        https://bugs.php.net/patch-display.php?bug=60362&patch=string_offset_trigger_notice.patch&revision=1323062240
 [2011-12-05 07:34 UTC] alan_k@php.net
I don't think the error trigger on isset() will work, isset() is used to avoid 
the errors....
 [2011-12-18 05:08 UTC] alan_k@php.net
The following patch has been added/updated:

Patch Name: isset_changed_warning_only_on_access.patch
Revision:   1324184882
URL:        https://bugs.php.net/patch-display.php?bug=60362&patch=isset_changed_warning_only_on_access.patch&revision=1324184882
 [2011-12-19 02:04 UTC] stas@php.net
Automatic comment from SVN on behalf of stas
Revision: http://svn.php.net/viewvc/?view=revision&revision=321145
Log: implement the solution for isset/string offsets, fix bug #60362
 [2011-12-19 02:10 UTC] stas@php.net
This bug has been fixed in SVN.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.

 For Windows:

http://windows.php.net/snapshots/
 
Thank you for the report, and for helping us make PHP better.

Applied patch making isset return false and access produce warning on invalid 
offsets.
 [2011-12-19 02:10 UTC] stas@php.net
-Status: Open +Status: Closed -Assigned To: +Assigned To: stas
 [2011-12-21 14:34 UTC] alan_k@php.net
The following patch has been added/updated:

Patch Name: fix_to_prevent_warning_on_isset_empty_for_55_and_a_half.patch
Revision:   1324478042
URL:        https://bugs.php.net/patch-display.php?bug=60362&patch=fix_to_prevent_warning_on_isset_empty_for_55_and_a_half.patch&revision=1324478042
 [2012-04-18 09:46 UTC] laruence@php.net
Automatic comment on behalf of stas
Revision: http://git.php.net/?p=php-src.git;a=commit;h=1f4f33afcfd8282bcdeff9ebcee7aade8c659308
Log: implement the solution for isset/string offsets, fix bug #60362
 [2012-07-24 23:38 UTC] rasmus@php.net
Automatic comment on behalf of stas
Revision: http://git.php.net/?p=php-src.git;a=commit;h=1f4f33afcfd8282bcdeff9ebcee7aade8c659308
Log: implement the solution for isset/string offsets, fix bug #60362
 [2013-11-17 09:34 UTC] laruence@php.net
Automatic comment on behalf of stas
Revision: http://git.php.net/?p=php-src.git;a=commit;h=1f4f33afcfd8282bcdeff9ebcee7aade8c659308
Log: implement the solution for isset/string offsets, fix bug #60362
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Oct 27 16:01:27 2024 UTC