Bug #65629 [Com]: SplObjectsStorage::detach() rewinds internal pointer
Edit report at https://bugs.php.net/bug.php?id=65629&edit=1
ID: 65629
Comment by: levim@php.net
Reported by: alan dot bem at gmail dot com
Summary: SplObjectsStorage::detach() rewinds internal pointer
Status: Verified
Type: Bug
Package: SPL related
PHP Version: Irrelevant
Assigned To: levim
Block user comment: N
Private report: N
New Comment:
Bug #63917 is a duplicate of this one (has a phpt uploaded -- might be useful).
Previous Comments:
------------------------------------------------------------------------
[2013-09-21 22:58:59] levim@php.net
Related To: Bug #63917
------------------------------------------------------------------------
[2013-09-12 22:49:38] levim@php.net
Regardless of whether this is a bug, in general modifying a structure during
iteration has undefined behavior. I will look a bit into this and see what might
be done.
------------------------------------------------------------------------
[2013-09-07 03:14:18] alan dot bem at gmail dot com
Description:
------------
It seems that SplObjectsStorage::detach() internally rewinds its array pointer.
PHP versions from 5.1.0 to 5.5.3 are affected.
Test script:
---------------
// To see this live, go to: http://3v4l.org/MAELj
<?php
class A
{
public $val;
public function __construct($val) { $this->val = $val; }
}
$storage = new SplObjectStorage;
for($i = 1; $i <= 10; $i++) {
$storage->attach(new A($i));
}
$iterations = 0;
$storage->rewind();
while ($storage->valid()) {
$iterations++;
$object = $storage->current();
echo 'Iteration #' . $iterations . ' with object A(' . $object->val .
')';
$storage->next();
if($iterations === 2 || $iterations === 8) {
$storage->detach($object);
echo ' - deleted Object A(' . $object->val . ') ';
}
echo PHP_EOL;
}
echo 'Number of iterations: ' . $iterations . PHP_EOL;
Expected result:
----------------
Iteration #1 with object A(1)
Iteration #2 with object A(2) - deleted Object A(2)
Iteration #3 with object A(3)
Iteration #4 with object A(4)
Iteration #5 with object A(5)
Iteration #6 with object A(6)
Iteration #7 with object A(7) - deleted Object A(7)
Iteration #8 with object A(8)
Iteration #9 with object A(9)
Iteration #10 with object A(10)
Number of iterations: 10
Actual result:
--------------
Iteration #1 with object A(1)
Iteration #2 with object A(2) - deleted Object A(2)
Iteration #3 with object A(1)
Iteration #4 with object A(3)
Iteration #5 with object A(4)
Iteration #6 with object A(5)
Iteration #7 with object A(6)
Iteration #8 with object A(7) - deleted Object A(7)
Iteration #9 with object A(1)
Iteration #10 with object A(3)
Iteration #11 with object A(4)
Iteration #12 with object A(5)
Iteration #13 with object A(6)
Iteration #14 with object A(8)
Iteration #15 with object A(9)
Iteration #16 with object A(10)
Number of iterations: 16
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=65629&edit=1
Thread (7 messages)