Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Psalm fails under php 8.2 official docker CLI image #9961

Closed
andrei-dascalu opened this issue Jun 26, 2023 · 12 comments · Fixed by #9942
Closed

Psalm fails under php 8.2 official docker CLI image #9961

andrei-dascalu opened this issue Jun 26, 2023 · 12 comments · Fixed by #9942

Comments

@andrei-dascalu
Copy link

Hello,

I'm trying to run psalm via the official Docker php 8.2 cli image with some extensions enabled and I'm getting this result:

Target PHP version: 8.2 (inferred from current PHP version) Enabled extensions: redis.
Scanning files...
Uncaught Psalm\Exception\TypeParseTreeException: int-mask types must all be integer values in /application/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php:903
Stack trace:
#0 /application/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php(181): Psalm\Internal\Type\TypeParser::getTypeFromGenericTree(Object(Psalm\Internal\Type\ParseTree\GenericTree), Object(Psalm\Codebase), Array, Array, false)
#1 /application/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php(151): Psalm\Internal\Type\TypeParser::getTypeFromTree(Object(Psalm\Internal\Type\ParseTree\GenericTree), Object(Psalm\Codebase), NULL, Array, Array, false)
#2 /application/vendor/vimeo/psalm/src/Psalm/Type.php(81): Psalm\Internal\Type\TypeParser::parseTokens(Array, NULL, Array)
#3 /application/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php(283): Psalm\Type::parseString('int-mask<GLOB_M...')
#4 /application/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php(110): Psalm\Internal\Codebase\InternalCallMapHandler::getCallablesFromCallMap('glob')
#5 /application/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php(86): Psalm\Internal\PhpVisitor\Reflector\ExpressionScanner::registerClassMapFunctionCall(Object(Psalm\Codebase), Object(Psalm\Storage\FileStorage), Object(Psalm\Internal\Scanner\FileScanner), Object(Psalm\Aliases), 'glob', Object(PhpParser\Node\Expr\FuncCall), Object(Psalm\Storage\MethodStorage), NULL)
#6 /application/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php(318): Psalm\Internal\PhpVisitor\Reflector\ExpressionScanner::scan(Object(Psalm\Codebase), Object(Psalm\Internal\Scanner\FileScanner), Object(Psalm\Storage\FileStorage), Object(Psalm\Aliases), Object(PhpParser\Node\Expr\FuncCall), Object(Psalm\Storage\MethodStorage), NULL)
#7 /application/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(123): Psalm\Internal\PhpVisitor\ReflectorVisitor->enterNode(Object(PhpParser\Node\Expr\FuncCall))
#8 /application/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Foreach_))
#9 /application/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray(Array)
#10 /application/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\If_))
#11 /application/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray(Array)
#12 /application/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\ClassMethod))
#13 /application/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray(Array)
#14 /application/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Class_))
#15 /application/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray(Array)
#16 /application/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Namespace_))
#17 /application/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(91): PhpParser\NodeTraverser->traverseArray(Array)
#18 /application/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php(79): PhpParser\NodeTraverser->traverse(Array)
#19 /application/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(554): Psalm\Internal\Scanner\FileScanner->scan(Object(Psalm\Codebase), Object(Psalm\Storage\FileStorage), false, Object(Psalm\Progress\DefaultProgress))
#20 /application/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(782): Psalm\Internal\Codebase\Scanner->scanFile('/application/ve...', Array, true)
#21 /application/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(428): Psalm\Internal\Codebase\Scanner->scanAPath(120, '/application/ve...')
#22 /application/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths(1)
#23 /application/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles(Object(Psalm\Internal\Codebase\ClassLikes), 1)
#24 /application/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(1072): Psalm\Codebase->scanFiles(1)
#25 /application/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(372): Psalm\Internal\Analyzer\ProjectAnalyzer->checkPaths(Array)
#26 /application/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run(Array)
#27 /application/vendor/bin/psalm(120): include('/application/ve...')
#28 {main}
(Psalm 5.13.0@a0a9c27630bcf8301ee78cb06741d2907d8c9fef crashed due to an uncaught Throwable)

I have a number of extensions enabled: igbinary, redis, xdebug, sodium, intl, iconv - however I don't see what exactly affects psalm. Running it locally without these enabled seems to work.

@psalm-github-bot
Copy link

Hey @andrei-dascalu, can you reproduce the issue on https://psalm.dev ?

@andrei-dascalu
Copy link
Author

I don't quite know how to - as in checking with various extensions enabled or not

@ygottschalk
Copy link
Contributor

Are you sure you are using php:8.2-cli and not php:8.2-alpine or some other alpine image?

Either way:
Duplicate of #9886
Fix should be here: #9942

Can you confirm the PR (or better the first commit of that PR as I am rn working on that) solves your issue?
This commit: f93d238

@thbley
Copy link
Contributor

thbley commented Jun 26, 2023

same issue with 8.2 on alpine: https://github.com/thbley/php_frameworkless/blob/master/docker/php82/Dockerfile

failing pipeline: https://github.com/thbley/php_frameworkless/actions/runs/5379097045/jobs/9759840959

psalm.phar 5.12.0 working

psalm.phar 5.13.0 failing

@bogdandubyk
Copy link

same for me psalm. 5.12.0 working on the alpine image, but 5.13.0 does not

@ygottschalk
Copy link
Contributor

Does f93d238 solve the issue for you?

@niconoe-
Copy link

Does f93d238 solve the issue for you?

I got the exact same issue than OP and using this exact commit version via composer solved the issue on my side. Thank you for this! When do you think a patch version could come up, and is there anything someone could do to help you release a fix?

@ygottschalk
Copy link
Contributor

I want to do improvements on #9942 (2nd commit) but I think best would be to do that in a seperate PR and get 1st commit released ASAP.

Sounds good? @orklah

@nocive
Copy link

nocive commented Jun 27, 2023

Also happens on php 8.1, it's not related to php 8.2.
As far as I can tell it's a regression in psalm 5.13, it works fine with 5.12.

The static analysis for all our apps broke with an update from 5.12 to 5.13.

@ygottschalk
Copy link
Contributor

@nocive Does #9942 fix the problem for you? Looking for as much feedback as possible so we do not "fail-fix" that...

@nocive
Copy link

nocive commented Jun 27, 2023

@ygottschalk i'll give it a go asap, need a few minutes.

@nocive
Copy link

nocive commented Jun 27, 2023

I can confirm #9942 fixes my problem 👍

$ composer psalm -- --version
> HOME=/tmp vendor-bin/psalm/vendor/bin/psalm --threads=4 '--version'
Psalm dev-fix/9886-glob-callmap-stub-crash@f93d23899de79beebd8f9d86561081c3583d2f59
stack trace for reference
Deep scanning /src/vendor/symfony/http-kernel/Kernel.php
Uncaught Psalm\Exception\TypeParseTreeException: int-mask types must all be integer values in /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php:903
Stack trace:
#0 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php(182): Psalm\Internal\Type\TypeParser::getTypeFromGenericTree(Object(Psalm\Internal\Type\ParseTree\GenericTree), Object(Psalm\Codebase), Array, Array, false)
#1 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php(152): Psalm\Internal\Type\TypeParser::getTypeFromTree(Object(Psalm\Internal\Type\ParseTree\GenericTree), Object(Psalm\Codebase), NULL, Array, Array, false)
#2 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Type.php(82): Psalm\Internal\Type\TypeParser::parseTokens(Array, NULL, Array)
#3 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/InternalCallMapHandler.php(283): Psalm\Type::parseString('int-mask<GLOB_M...')
#4 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php(110): Psalm\Internal\Codebase\InternalCallMapHandler::getCallablesFromCallMap('glob')
#5 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php(87): Psalm\Internal\PhpVisitor\Reflector\ExpressionScanner::registerClassMapFunctionCall(Object(Psalm\Codebase), Object(Psalm\Storage\FileStorage), Object(Psalm\Internal\Scanner\FileScanner), Object(Psalm\Aliases), 'glob', Object(PhpParser\Node\Expr\FuncCall), Object(Psalm\Storage\MethodStorage), NULL)
#6 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php(325): Psalm\Internal\PhpVisitor\Reflector\ExpressionScanner::scan(Object(Psalm\Codebase), Object(Psalm\Internal\Scanner\FileScanner), Object(Psalm\Storage\FileStorage), Object(Psalm\Aliases), Object(PhpParser\Node\Expr\FuncCall), Object(Psalm\Storage\MethodStorage), NULL)
#7 /src/vendor-bin/psalm/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(123): Psalm\Internal\PhpVisitor\ReflectorVisitor->enterNode(Object(PhpParser\Node\Expr\FuncCall))
#8 /src/vendor-bin/psalm/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Foreach_))
#9 /src/vendor-bin/psalm/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray(Array)
#10 /src/vendor-bin/psalm/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\If_))
#11 /src/vendor-bin/psalm/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray(Array)
#12 /src/vendor-bin/psalm/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\ClassMethod))
#13 /src/vendor-bin/psalm/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray(Array)
#14 /src/vendor-bin/psalm/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Class_))
#15 /src/vendor-bin/psalm/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray(Array)
#16 /src/vendor-bin/psalm/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Namespace_))
#17 /src/vendor-bin/psalm/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(91): PhpParser\NodeTraverser->traverseArray(Array)
#18 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php(79): PhpParser\NodeTraverser->traverse(Array)
#19 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(558): Psalm\Internal\Scanner\FileScanner->scan(Object(Psalm\Codebase), Object(Psalm\Storage\FileStorage), false, Object(Psalm\Progress\DebugProgress))
#20 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(785): Psalm\Internal\Codebase\Scanner->scanFile('/src/applicatio...', Array, true)
#21 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(428): Psalm\Internal\Codebase\Scanner->scanAPath(36, '/src/applicatio...')
#22 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths(1)
#23 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles(Object(Psalm\Internal\Codebase\ClassLikes), 4)
#24 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(518): Psalm\Codebase->scanFiles(4)
#25 /src/vendor-bin/psalm/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(370): Psalm\Internal\Analyzer\ProjectAnalyzer->check('/src/applicatio...', true)
#26 /src/vendor-bin/psalm/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run(Array)
#27 /src/vendor-bin/psalm/vendor/bin/psalm(119): include('/src/applicatio...')
#28 {main}
(Psalm 5.13.0@a0a9c27630bcf8301ee78cb06741d2907d8c9fef crashed due to an uncaught Throwable)
Script HOME=/tmp vendor-bin/psalm/vendor/bin/psalm --threads=4 handling the psalm event returned with error code 1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants