Skip to content

Crash with level 7+ with strict rules with isset() checks after json_decode() #13529

@DemvSteinbrink

Description

@DemvSteinbrink

Bug report

The following creates an internal error at level 7 and above, iff strict rules are enabled.

<?php

function test(string $x): void {
	$tmp = json_decode($x, false);

	if (!isset($tmp->foo) || !isset($tmp->bar)) {
    }
}

The error does not appear if the string given to json_decode() is provided as a constant. It also disappear if the two isset checks are combined into a single one.

Stack trace:

     ## phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Type/IntersectionType.php(462)                                                                                                    
     #0 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Type/IntersectionType.php(449): PHPStan\Type\IntersectionType->getUnresolvedInstancePropertyPrototype()                           
     #1 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Rules/Properties/AccessPropertiesCheck.php(200): PHPStan\Type\IntersectionType->getInstanceProperty()                             
     #2 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Rules/Properties/AccessPropertiesCheck.php(115): PHPStan\Rules\Properties\AccessPropertiesCheck->pickProperty()                   
     #3 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Rules/Properties/AccessPropertiesCheck.php(84): PHPStan\Rules\Properties\AccessPropertiesCheck->processSingleProperty()           
     #4 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Rules/Properties/AccessPropertiesRule.php(28): PHPStan\Rules\Properties\AccessPropertiesCheck->check()                            
     #5 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/FileAnalyser.php(129): PHPStan\Rules\Properties\AccessPropertiesRule->processNode()                                      
     #6 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(638): PHPStan\Analyser\FileAnalyser->{closure:PHPStan\Analyser\FileAnalyser::analyseFile():102}()  
     #7 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(3532):                                                                                             
     PHPStan\Analyser\NodeScopeResolver::{closure:PHPStan\Analyser\NodeScopeResolver::processStmtNode():637}()                                                                                                                   
     #8 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(1981): PHPStan\Analyser\NodeScopeResolver->callNodeCallbackWithExpression()                        
     #9 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(2732): PHPStan\Analyser\NodeScopeResolver->processExprNode()                                       
     #10 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(2681): PHPStan\Analyser\NodeScopeResolver->processExprNode()                                      
     #11 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(2581): PHPStan\Analyser\NodeScopeResolver->processExprNode()                                      
     #12 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(944): PHPStan\Analyser\NodeScopeResolver->processExprNode()                                       
     #13 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(520): PHPStan\Analyser\NodeScopeResolver->processStmtNode()                                       
     #14 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(637): PHPStan\Analyser\NodeScopeResolver->processStmtNodes()                                      
     #15 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(468): PHPStan\Analyser\NodeScopeResolver->processStmtNode()                                       
     #16 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/FileAnalyser.php(203): PHPStan\Analyser\NodeScopeResolver->processNodes()                                               
     #17 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Command/WorkerCommand.php(149): PHPStan\Analyser\FileAnalyser->analyseFile()                                                     
     #18 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/vendor/evenement/evenement/src/EventEmitterTrait.php(111):                                                                           
     PHPStan\Command\WorkerCommand::{closure:PHPStan\Command\WorkerCommand::runWorker():126}()                                                                                                                                   
     #19 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/vendor/clue/ndjson-react/src/Decoder.php(117): _PHPStan_109b3c977\Evenement\EventEmitter->emit()                                     
     #20 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/vendor/evenement/evenement/src/EventEmitterTrait.php(111): _PHPStan_109b3c977\Clue\React\NDJson\Decoder->handleData()                
     #21 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/vendor/react/stream/src/Util.php(62): _PHPStan_109b3c977\Evenement\EventEmitter->emit()                                              
     #22 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/vendor/evenement/evenement/src/EventEmitterTrait.php(111):                                                                           
     _PHPStan_109b3c977\React\Stream\Util::{closure:_PHPStan_109b3c977\React\Stream\Util::forwardEvents():61}()                                                                                                                  
     #23 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/vendor/react/stream/src/DuplexResourceStream.php(168): _PHPStan_109b3c977\Evenement\EventEmitter->emit()                             
     #24 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/vendor/react/event-loop/src/StreamSelectLoop.php(201): _PHPStan_109b3c977\React\Stream\DuplexResourceStream->handleData()            
     #25 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/vendor/react/event-loop/src/StreamSelectLoop.php(173): _PHPStan_109b3c977\React\EventLoop\StreamSelectLoop->waitForStreamActivity()  
     #26 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/src/Command/WorkerCommand.php(105): _PHPStan_109b3c977\React\EventLoop\StreamSelectLoop->run()                                       
     #27 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Command/Command.php(259): PHPStan\Command\WorkerCommand->execute()                                            
     #28 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(868): _PHPStan_109b3c977\Symfony\Component\Console\Command\Command->run()                     
     #29 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(261): _PHPStan_109b3c977\Symfony\Component\Console\Application->doRunCommand()                
     #30 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(157): _PHPStan_109b3c977\Symfony\Component\Console\Application->doRun()                       
     #31 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan(96): _PHPStan_109b3c977\Symfony\Component\Console\Application->run()                                                     
     #32 phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan(97): {closure:phar:///home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan:14}()       
     #33 /home/bsteinbrink/src/dummy/vendor/phpstan/phpstan/phpstan(8): require('...')                                                                                                                               
     #34 /home/bsteinbrink/src/dummy/vendor/bin/phpstan(119): include('...')                                                                                                                                         
     #35 {main}                                                                                                                                                                                                                  

Code snippet that reproduces the problem

https://phpstan.org/r/d92d5005-caed-4506-b5d2-5bcf0d76ec96

Expected output

PHPStan should not crash

Did PHPStan help you today? Did it make you happy in any way?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions