vimeo / psalm

A static analysis tool for finding errors in PHP applications
https://psalm.dev
MIT License
5.54k stars 660 forks source link

Psalm crashes when run with php version set to 8 or higher #9090

Open mstilkerich opened 1 year ago

mstilkerich commented 1 year ago

When running psalm with --php-version=8.0 or higher, it crashes with the stack trace shown below. The issue does not happen when I set a 7.x PHP version.

It appears the issue is caused by the code line:

if (!function_exists('gd_info')) { return null; }

The full file is here. Though I am not sure, because the issue sometimes disappears when I save the file, even after reverting back to the original content. So maybe it is also related to some cache that gets invalidated just by the updated mtime of the file and is not related to my change at all.

vendor/bin/psalm --threads=8 --report=testreports/psalm.txt --report-show-info=true --no-diff
Target PHP version: 8.0 (inferred from composer.json) Extensions enabled: pdo (unsupported extensions: gd, json)
Scanning files...
Analyzing files...

Uncaught Exception: InvalidArgumentException Could not get class storage for gdimage
Emitted in /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45
Stack trace in the forked worker:
#0 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php(673): Psalm\Internal\Provider\ClassLikeStorageProvider->get()
#1 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php(186): Psalm\Internal\Type\TypeExpander::expandNamedObject()
#2 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php(84): Psalm\Internal\Type\TypeExpander::expandAtomic()
#3 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php(281): Psalm\Internal\Type\TypeExpander::expandUnion()
#4 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php(192): Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentAnalyzer::checkFunctionLikeTypeMatches()
#5 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php(1017): Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentAnalyzer::checkArgumentMatches()
#6 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php(227): Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentsAnalyzer::checkArgumentsMatch()
#7 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(296): Psalm\Internal\Analyzer\Statements\Expression\Call\FunctionCallAnalyzer::analyze()
#8 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(86): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#9 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php(242): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#10 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(544): Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer::analyze()
#11 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(178): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyzeAssignment()
#12 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(86): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#13 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php(158): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#14 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(64): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer::analyze()
#15 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(266): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze()
#16 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(86): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#17 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php(67): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#18 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(64): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer::analyze()
#19 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(266): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze()
#20 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(86): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#21 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php(67): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#22 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(64): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer::analyze()
#23 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(266): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze()
#24 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(86): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#25 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php(169): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#26 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php(104): Psalm\Internal\Analyzer\Statements\Block\IfConditionalAnalyzer::analyze()
#27 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php(52): Psalm\Internal\Analyzer\Statements\Block\IfElseAnalyzer::analyze()
#28 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(64): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer::analyze()
#29 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(266): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze()
#30 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(86): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#31 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(565): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#32 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(194): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement()
#33 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php(457): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze()
#34 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php(1798): Psalm\Internal\Analyzer\FunctionLikeAnalyzer->analyze()
#35 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php(425): Psalm\Internal\Analyzer\ClassAnalyzer->analyzeClassMethod()
#36 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php(203): Psalm\Internal\Analyzer\ClassAnalyzer->analyze()
#37 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(1581): Psalm\Internal\Analyzer\FileAnalyzer->analyze()
#38 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(209): Psalm\Internal\Codebase\Analyzer->analysisWorker()
#39 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(373): Psalm\Internal\Fork\Pool->__construct()
#40 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(272): Psalm\Internal\Codebase\Analyzer->doAnalysis()
#41 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(651): Psalm\Internal\Codebase\Analyzer->analyzeFiles()
#42 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(380): Psalm\Internal\Analyzer\ProjectAnalyzer->check()
#43 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run()
#44 /media/psf/projects/rcmcarddav/vendor/bin/psalm(120): include('...')
#45 {main} in /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php:397
Stack trace:
#0 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(431): Psalm\Internal\Fork\Pool->readResultsFromChildren()
#1 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(406): Psalm\Internal\Fork\Pool->wait()
#2 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(272): Psalm\Internal\Codebase\Analyzer->doAnalysis()
#3 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(651): Psalm\Internal\Codebase\Analyzer->analyzeFiles()
#4 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(380): Psalm\Internal\Analyzer\ProjectAnalyzer->check()
#5 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run()
#6 /media/psf/projects/rcmcarddav/vendor/bin/psalm(120): include('...')
#7 {main}
(Psalm 5.4.0@62db5d4f6a7ae0a20f7cc5a4952d730272fc0863 crashed due to an uncaught Throwable)
alies-dev commented 1 year ago

@mstilkerich can you please run php --rc gdimage at the same PHP interpreter as you used for Psalm? Most likely you use PHP < 8.0 to run psalm or gd ext is not installed

@weirdan idea 1: How about creation a special documentation for Could not get class storage for ... issues? We can customize exaception message to something like

throw new InvalidArgumentException("Could not get class storage for {$fq_classlike_name} class (see https://psalm.dev/fatals/001)");

idea 2: How about a new psalm command to dump all important config and env info? - config, loaded plugins, stubs, etc

mstilkerich commented 1 year ago

Hello,

below is the output you asked for. But just to be clear: The PHP interpreter (currently v8.2.1) is not changed. What I did change is only the --php-version command-line option for psalm.

The following three commands have been directly executed in sequence without anything in between.

php --rc gdimage ``` mikey@forge[rcmcarddav] php --rc gdimage Class [ final class GdImage ] { - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [0] { } } ```
psalm --threads=8 --report=testreports/psalm.txt --report-show-info=true --no-diff --php-version=7.4 ``` mikey@forge[rcmcarddav] vendor/bin/psalm --threads=8 --report=testreports/psalm.txt --report-show-info=true --no-diff --php-version=7.4 Target PHP version: 7.4 (set by CLI argument) Extensions enabled: pdo (unsupported extensions: gd, json) Scanning files... Deprecation: Psalm stubs for ext-random loaded using legacy way. Instead, please declare ext-random as dependency in composer.json or use directive in Psalm config. Analyzing files... ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ------------------------------ No errors found! ------------------------------ Checks took 1.50 seconds and used 342.135MB of memory Psalm was able to infer types for 100% of the codebase ```
psalm --threads=8 --report=testreports/psalm.txt --report-show-info=true --no-diff --php-version=8.0 ``` mikey@forge[rcmcarddav] vendor/bin/psalm --threads=8 --report=testreports/psalm.txt --report-show-info=true --no-diff --php-version=8.0 Target PHP version: 8.0 (set by CLI argument) Extensions enabled: pdo (unsupported extensions: gd, json) Scanning files... Deprecation: Psalm stubs for ext-random loaded using legacy way. Instead, please declare ext-random as dependency in composer.json or use directive in Psalm config. Analyzing files... ░░░░░░Uncaught Exception: InvalidArgumentException Could not get class storage for gdimage Emitted in /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45 Stack trace in the forked worker: #0 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php(672): Psalm\Internal\Provider\ClassLikeStorageProvider->get() #1 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php(185): Psalm\Internal\Type\TypeExpander::expandNamedObject() #2 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php(83): Psalm\Internal\Type\TypeExpander::expandAtomic() #3 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php(272): Psalm\Internal\Type\TypeExpander::expandUnion() #4 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php(191): Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentAnalyzer::checkFunctionLikeTypeMatches() #5 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php(1016): Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentAnalyzer::checkArgumentMatches() #6 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php(218): Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentsAnalyzer::checkArgumentsMatch() #7 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(295): Psalm\Internal\Analyzer\Statements\Expression\Call\FunctionCallAnalyzer::analyze() #8 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(85): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression() #9 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php(242): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze() #10 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(536): Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer::analyze() #11 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(178): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyzeAssignment() #12 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(85): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression() #13 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php(158): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze() #14 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(63): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer::analyze() #15 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(265): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze() #16 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(85): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression() #17 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php(67): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze() #18 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(63): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer::analyze() #19 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(265): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze() #20 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(85): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression() #21 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php(67): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze() #22 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(63): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer::analyze() #23 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(265): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze() #24 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(85): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression() #25 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php(169): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze() #26 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php(98): Psalm\Internal\Analyzer\Statements\Block\IfConditionalAnalyzer::analyze() #27 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php(52): Psalm\Internal\Analyzer\Statements\Block\IfElseAnalyzer::analyze() #28 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(63): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer::analyze() #29 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(265): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze() #30 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(85): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression() #31 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(559): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze() #32 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(194): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement() #33 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php(457): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze() #34 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php(1795): Psalm\Internal\Analyzer\FunctionLikeAnalyzer->analyze() #35 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php(424): Psalm\Internal\Analyzer\ClassAnalyzer->analyzeClassMethod() #36 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php(203): Psalm\Internal\Analyzer\ClassAnalyzer->analyze() #37 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(1581): Psalm\Internal\Analyzer\FileAnalyzer->analyze() #38 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(209): Psalm\Internal\Codebase\Analyzer->analysisWorker() #39 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(372): Psalm\Internal\Fork\Pool->__construct() #40 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(272): Psalm\Internal\Codebase\Analyzer->doAnalysis() #41 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(647): Psalm\Internal\Codebase\Analyzer->analyzeFiles() #42 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(380): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #43 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #44 /media/psf/projects/rcmcarddav/vendor/bin/psalm(120): include('...') #45 {main} in /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php:397 Stack trace: #0 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(431): Psalm\Internal\Fork\Pool->readResultsFromChildren() #1 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(406): Psalm\Internal\Fork\Pool->wait() #2 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(272): Psalm\Internal\Codebase\Analyzer->doAnalysis() #3 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(647): Psalm\Internal\Codebase\Analyzer->analyzeFiles() #4 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(380): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #5 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #6 /media/psf/projects/rcmcarddav/vendor/bin/psalm(120): include('...') #7 {main} (Psalm 5.4.0@62db5d4f6a7ae0a20f7cc5a4952d730272fc0863 crashed due to an uncaught Throwable) ```
weirdan commented 1 year ago

Can you still reproduce it with latest 5.x?

mstilkerich commented 1 year ago

Yes, it's still the same with 5.15.

psalm --threads=8 --report=testreports/psalm.txt --report-show-info=true --no-diff --php-version=7.4 ``` vendor/bin/psalm --threads=8 --report=testreports/psalm.txt --report-show-info=true --no-diff --php-version=7.4 Target PHP version: 7.4 (set by CLI argument) Enabled extensions: pdo. Scanning files... Analyzing files... ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ------------------------------ No errors found! ------------------------------ Checks took 1.80 seconds and used 331.495MB of memory Psalm was able to infer types for 100% of the codebase ```
psalm --threads=8 --report=testreports/psalm.txt --report-show-info=true --no-diff --php-version=8.0 ``` vendor/bin/psalm --threads=8 --report=testreports/psalm.txt --report-show-info=true --no-diff --php-version=8.0 Target PHP version: 8.0 (set by CLI argument) Enabled extensions: pdo. Scanning files... Analyzing files... ░░░░░░░░░░░░Uncaught Exception: InvalidArgumentException Could not get class storage for gdimage Emitted in /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45 Stack trace in the forked worker: #0 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php(628): Psalm\Internal\Provider\ClassLikeStorageProvider->get() #1 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php(174): Psalm\Internal\Type\TypeExpander::expandNamedObject() #2 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeExpander.php(76): Psalm\Internal\Type\TypeExpander::expandAtomic() #3 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php(276): Psalm\Internal\Type\TypeExpander::expandUnion() #4 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php(195): Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentAnalyzer::checkFunctionLikeTypeMatches() #5 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php(849): Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentAnalyzer::checkArgumentMatches() #6 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php(218): Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentsAnalyzer::checkArgumentsMatch() #7 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(286): Psalm\Internal\Analyzer\Statements\Expression\Call\FunctionCallAnalyzer::analyze() #8 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(90): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression() #9 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php(243): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze() #10 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(527): Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer::analyze() #11 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(169): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyzeAssignment() #12 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(90): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression() #13 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php(161): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze() #14 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(63): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer::analyze() #15 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(256): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze() #16 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(90): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression() #17 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php(67): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze() #18 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(63): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer::analyze() #19 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(256): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze() #20 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(90): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression() #21 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php(67): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze() #22 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(63): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer::analyze() #23 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(256): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze() #24 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(90): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression() #25 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfConditionalAnalyzer.php(169): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze() #26 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/IfElseAnalyzer.php(98): Psalm\Internal\Analyzer\Statements\Block\IfConditionalAnalyzer::analyze() #27 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/AndAnalyzer.php(52): Psalm\Internal\Analyzer\Statements\Block\IfElseAnalyzer::analyze() #28 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(63): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\AndAnalyzer::analyze() #29 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(256): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze() #30 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(90): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression() #31 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(560): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze() #32 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(194): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement() #33 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php(471): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze() #34 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php(1802): Psalm\Internal\Analyzer\FunctionLikeAnalyzer->analyze() #35 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php(415): Psalm\Internal\Analyzer\ClassAnalyzer->analyzeClassMethod() #36 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php(202): Psalm\Internal\Analyzer\ClassAnalyzer->analyze() #37 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(1591): Psalm\Internal\Analyzer\FileAnalyzer->analyze() #38 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(210): Psalm\Internal\Codebase\Analyzer->analysisWorker() #39 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(372): Psalm\Internal\Fork\Pool->__construct() #40 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(272): Psalm\Internal\Codebase\Analyzer->doAnalysis() #41 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(564): Psalm\Internal\Codebase\Analyzer->analyzeFiles() #42 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(379): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #43 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #44 /media/psf/projects/rcmcarddav/vendor/bin/psalm(120): include('...') #45 {main} in /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php:398 Stack trace: #0 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(432): Psalm\Internal\Fork\Pool->readResultsFromChildren() #1 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(406): Psalm\Internal\Fork\Pool->wait() #2 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(272): Psalm\Internal\Codebase\Analyzer->doAnalysis() #3 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(564): Psalm\Internal\Codebase\Analyzer->analyzeFiles() #4 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(379): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #5 /media/psf/projects/rcmcarddav/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #6 /media/psf/projects/rcmcarddav/vendor/bin/psalm(120): include('...') #7 {main} (Psalm 5.15.0@5c774aca4746caf3d239d9c8cadb9f882ca29352 crashed due to an uncaught Throwable) ```
weirdan commented 1 year ago

Can you reproduce it with --no-cache? And with --threads=1 --debug-by-line >log.file 2>&1 (here the really interesting part would be a couple of dozens lines before the crash).

mstilkerich commented 1 year ago

With --no-cache the crash does not occur.

So here is the debug-by-line log without using --no-cache.

Btw, the analyzed source files you can take a look at here if needed.

vendor/bin/psalm --threads=1 --report=testreports/psalm.txt --report-show-info=true --no-diff --php-version=7.4 --debug-by-line >psalm74.log 2>&1
vendor/bin/psalm --threads=1 --report=testreports/psalm.txt --report-show-info=true --no-diff --php-version=8.0 --debug-by-line >psalm80.log 2>&1

psalm74.log psalm80.log

weirdan commented 1 year ago

Can you also confirm you have the gd extension installed? php --rc gdimage should produce something similar to

Class [ <internal:gd> final class GdImage ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [0] {
  }

  - Methods [0] {
  }
}
weirdan commented 1 year ago

Unfortunately I can't reproduce the issue. I did the following:

  1. Cloned the repo
  2. Cloned mstilkerich/roundcubemail into roundcubemail folder
  3. composer update
  4. Ran
    vendor/bin/psalm --threads=1 --report=testreports/psalm.txt --report-show-info=true --no-diff --php-version=7.4 --debug-by-line >psalm74.log 2>&1
    vendor/bin/psalm --threads=1 --report=testreports/psalm.txt --report-show-info=true --no-diff --php-version=8.0 --debug-by-line >psalm80.log 2>&1
  5. It was completed successfully.
weirdan commented 1 year ago

Actually I've managed to reproduce it now.

weirdan commented 1 year ago

Narrowed it down to this:

<?php

namespace MStilkerich\RCMCardDAV;

final class Tst 
{
    private function f(): void
    {
        imagesy(imagecreatefromstring(''));
    }
}
weirdan commented 1 year ago

Actually I've managed to reproduce it now.

And it disappeared again. :confused: