From f9439c9785527982242b22549b6ccacf03566a8d Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Sun, 20 Jul 2025 13:51:48 +0200 Subject: [PATCH 1/5] Fix --- bin/functionMetadata_original.php | 6 +++ ...rictComparisonOfDifferentTypesRuleTest.php | 5 ++ .../Rules/Comparison/data/bug-10884.php | 49 +++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 tests/PHPStan/Rules/Comparison/data/bug-10884.php diff --git a/bin/functionMetadata_original.php b/bin/functionMetadata_original.php index a57224a0bb..f8e1930324 100644 --- a/bin/functionMetadata_original.php +++ b/bin/functionMetadata_original.php @@ -183,6 +183,12 @@ 'SplFileObject::ftruncate' => ['hasSideEffects' => true], 'SplFileObject::fwrite' => ['hasSideEffects' => true], + 'SplObjectStorage::addAll' => ['hasSideEffects' => true], + 'SplObjectStorage::attach' => ['hasSideEffects' => true], + 'SplObjectStorage::detach' => ['hasSideEffects' => true], + 'SplObjectStorage::removeAll' => ['hasSideEffects' => true], + 'SplObjectStorage::removeAllExcept' => ['hasSideEffects' => true], + 'XmlReader::next' => ['hasSideEffects' => true], 'XmlReader::read' => ['hasSideEffects' => true], ]; diff --git a/tests/PHPStan/Rules/Comparison/StrictComparisonOfDifferentTypesRuleTest.php b/tests/PHPStan/Rules/Comparison/StrictComparisonOfDifferentTypesRuleTest.php index 3e75e3bc52..a0efad16b4 100644 --- a/tests/PHPStan/Rules/Comparison/StrictComparisonOfDifferentTypesRuleTest.php +++ b/tests/PHPStan/Rules/Comparison/StrictComparisonOfDifferentTypesRuleTest.php @@ -996,6 +996,11 @@ public function testBug12946(): void $this->analyse([__DIR__ . '/data/bug-12946.php'], []); } + public function testBug10884(): void + { + $this->analyse([__DIR__ . '/data/bug-10884.php'], []); + } + public function testBug13208(): void { $this->analyse([__DIR__ . '/data/bug-13208.php'], []); diff --git a/tests/PHPStan/Rules/Comparison/data/bug-10884.php b/tests/PHPStan/Rules/Comparison/data/bug-10884.php new file mode 100644 index 0000000000..36845f3f47 --- /dev/null +++ b/tests/PHPStan/Rules/Comparison/data/bug-10884.php @@ -0,0 +1,49 @@ + $map */ +$map = new \SplObjectStorage(); +$map->attach(new Cat()); +$map->attach(new Cat()); + +class Manager +{ + /** + * @param SplObjectStorage $map + */ + public function doSomething(\SplObjectStorage $map): void + { + /** @var \SplObjectStorage $other */ + $other = new \SplObjectStorage(); + + if (count($map) === 0) { + return; + } + + foreach ($map as $cat) { + if (!$this->someCheck($cat)) { + continue; + } + + $other->attach($cat); + } + + $map->removeAll($other); + + if (count($map) === 0) { + return; + } + + // ok! + } + + private function someCheck(Cat $cat): bool { + // just some random + return $cat == true; + } +} + +(new Manager())->doSomething($map); From f8edb88a64b830afdd399244fe5e81384112252b Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Sun, 20 Jul 2025 13:52:00 +0200 Subject: [PATCH 2/5] Run bin --- resources/functionMetadata.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/resources/functionMetadata.php b/resources/functionMetadata.php index fd7076124f..f5d8029b75 100644 --- a/resources/functionMetadata.php +++ b/resources/functionMetadata.php @@ -651,6 +651,11 @@ 'SplFileObject::fseek' => ['hasSideEffects' => true], 'SplFileObject::ftruncate' => ['hasSideEffects' => true], 'SplFileObject::fwrite' => ['hasSideEffects' => true], + 'SplObjectStorage::addAll' => ['hasSideEffects' => true], + 'SplObjectStorage::attach' => ['hasSideEffects' => true], + 'SplObjectStorage::detach' => ['hasSideEffects' => true], + 'SplObjectStorage::removeAll' => ['hasSideEffects' => true], + 'SplObjectStorage::removeAllExcept' => ['hasSideEffects' => true], 'Spoofchecker::__construct' => ['hasSideEffects' => false], 'StringBackedEnum::from' => ['hasSideEffects' => false], 'StringBackedEnum::tryFrom' => ['hasSideEffects' => false], From ede3c5757537b2c54434a2138ac0eb8dd1ac33b3 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Mon, 21 Jul 2025 00:39:41 +0200 Subject: [PATCH 3/5] Add other Spl classes --- bin/functionMetadata_original.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/bin/functionMetadata_original.php b/bin/functionMetadata_original.php index f8e1930324..d429d11b59 100644 --- a/bin/functionMetadata_original.php +++ b/bin/functionMetadata_original.php @@ -170,6 +170,9 @@ 'DateTimeImmutable::getTimestamp' => ['hasSideEffects' => false], 'DateTimeImmutable::getTimezone' => ['hasSideEffects' => false], + 'SplDoublyLinkedList::pop' => ['hasSideEffects' => true], + 'SplDoublyLinkedList::shift' => ['hasSideEffects' => true], + 'SplFileObject::fflush' => ['hasSideEffects' => true], 'SplFileObject::fgetc' => ['hasSideEffects' => true], 'SplFileObject::fgetcsv' => ['hasSideEffects' => true], @@ -183,12 +186,24 @@ 'SplFileObject::ftruncate' => ['hasSideEffects' => true], 'SplFileObject::fwrite' => ['hasSideEffects' => true], + 'SplFixedArray::extract' => ['hasSideEffects' => true], + + 'SplHead::extract' => ['hasSideEffects' => true], + 'SplHead::insert' => ['hasSideEffects' => true], + 'SplHead::recoverFromCorruption' => ['hasSideEffects' => true], + 'SplObjectStorage::addAll' => ['hasSideEffects' => true], 'SplObjectStorage::attach' => ['hasSideEffects' => true], 'SplObjectStorage::detach' => ['hasSideEffects' => true], 'SplObjectStorage::removeAll' => ['hasSideEffects' => true], 'SplObjectStorage::removeAllExcept' => ['hasSideEffects' => true], + 'SplPriorityQueue::extract' => ['hasSideEffects' => true], + 'SplPriorityQueue::insert' => ['hasSideEffects' => true], + 'SplPriorityQueue::recoverFromCorruption' => ['hasSideEffects' => true], + + 'SplQueue::dequeue' => ['hasSideEffects' => true], + 'XmlReader::next' => ['hasSideEffects' => true], 'XmlReader::read' => ['hasSideEffects' => true], ]; From 582adc190f38e3300d160b976b645fd7189ff270 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Mon, 21 Jul 2025 00:40:43 +0200 Subject: [PATCH 4/5] Run bin --- resources/functionMetadata.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/resources/functionMetadata.php b/resources/functionMetadata.php index f5d8029b75..97f858cc49 100644 --- a/resources/functionMetadata.php +++ b/resources/functionMetadata.php @@ -639,6 +639,8 @@ 'SimpleXMLIterator::hasChildren' => ['hasSideEffects' => false], 'SimpleXMLIterator::valid' => ['hasSideEffects' => false], 'SoapFault::__construct' => ['hasSideEffects' => false], + 'SplDoublyLinkedList::pop' => ['hasSideEffects' => true], + 'SplDoublyLinkedList::shift' => ['hasSideEffects' => true], 'SplFileObject::fflush' => ['hasSideEffects' => true], 'SplFileObject::fgetc' => ['hasSideEffects' => true], 'SplFileObject::fgetcsv' => ['hasSideEffects' => true], @@ -651,11 +653,19 @@ 'SplFileObject::fseek' => ['hasSideEffects' => true], 'SplFileObject::ftruncate' => ['hasSideEffects' => true], 'SplFileObject::fwrite' => ['hasSideEffects' => true], + 'SplFixedArray::extract' => ['hasSideEffects' => true], + 'SplHead::extract' => ['hasSideEffects' => true], + 'SplHead::insert' => ['hasSideEffects' => true], + 'SplHead::recoverFromCorruption' => ['hasSideEffects' => true], 'SplObjectStorage::addAll' => ['hasSideEffects' => true], 'SplObjectStorage::attach' => ['hasSideEffects' => true], 'SplObjectStorage::detach' => ['hasSideEffects' => true], 'SplObjectStorage::removeAll' => ['hasSideEffects' => true], 'SplObjectStorage::removeAllExcept' => ['hasSideEffects' => true], + 'SplPriorityQueue::extract' => ['hasSideEffects' => true], + 'SplPriorityQueue::insert' => ['hasSideEffects' => true], + 'SplPriorityQueue::recoverFromCorruption' => ['hasSideEffects' => true], + 'SplQueue::dequeue' => ['hasSideEffects' => true], 'Spoofchecker::__construct' => ['hasSideEffects' => false], 'StringBackedEnum::from' => ['hasSideEffects' => false], 'StringBackedEnum::tryFrom' => ['hasSideEffects' => false], From f7268e0418ce957703643128ed9a7e3400bf3dd7 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Mon, 21 Jul 2025 00:48:19 +0200 Subject: [PATCH 5/5] Add non regression test --- ...mparisonOperatorsConstantConditionRuleTest.php | 6 ++++++ tests/PHPStan/Rules/Comparison/data/bug-9180.php | 15 +++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 tests/PHPStan/Rules/Comparison/data/bug-9180.php diff --git a/tests/PHPStan/Rules/Comparison/NumberComparisonOperatorsConstantConditionRuleTest.php b/tests/PHPStan/Rules/Comparison/NumberComparisonOperatorsConstantConditionRuleTest.php index e6913ff669..f05edf6b3d 100644 --- a/tests/PHPStan/Rules/Comparison/NumberComparisonOperatorsConstantConditionRuleTest.php +++ b/tests/PHPStan/Rules/Comparison/NumberComparisonOperatorsConstantConditionRuleTest.php @@ -245,6 +245,12 @@ public function testBug9850(): void $this->analyse([__DIR__ . '/data/bug-9850.php'], []); } + public function testBug9180(): void + { + $this->treatPhpDocTypesAsCertain = true; + $this->analyse([__DIR__ . '/data/bug-9180.php'], []); + } + public function testBug12716(): void { $this->treatPhpDocTypesAsCertain = true; diff --git a/tests/PHPStan/Rules/Comparison/data/bug-9180.php b/tests/PHPStan/Rules/Comparison/data/bug-9180.php new file mode 100644 index 0000000000..d92e3b213c --- /dev/null +++ b/tests/PHPStan/Rules/Comparison/data/bug-9180.php @@ -0,0 +1,15 @@ +push(1); + +if ($queue->count() > 0) { + for ($i=0;$i<5;$i++) { + while ($queue->count() > 0 && $value = $queue->shift()) { + //do something with $value + } + } +}