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 4.6.2 crashed due to an uncaught Throwable #5363

Closed
johnny-silverhand opened this issue Mar 10, 2021 · 10 comments · Fixed by #5369
Closed

Psalm 4.6.2 crashed due to an uncaught Throwable #5363

johnny-silverhand opened this issue Mar 10, 2021 · 10 comments · Fixed by #5369

Comments

@johnny-silverhand
Copy link

user@dev:/var/www/test1$ ./vendor/bin/psalm --init
Calculating best config level based on project files
Calculating best config level based on project files
Scanning files...
Analyzing files...

Uncaught Exception: Psalm\Type::getInt(): Argument #2 ($value) must be of type ?int, float given, called in /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonDivArithmeticOpAnalyzer.php on line 315
Stack trace in the forked worker:
#0 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonDivArithmeticOpAnalyzer.php(315): Psalm\Type::getInt()
#1 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonDivArithmeticOpAnalyzer.php(183): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\NonDivArithmeticOpAnalyzer::analyzeNonDivOperands()
#2 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonComparisonOpAnalyzer.php(59): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\NonDivArithmeticOpAnalyzer::analyze()
#3 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(334): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\NonComparisonOpAnalyzer::analyze()
#4 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(95): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze()
#5 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(228): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze()
#6 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(40): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#7 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php(790): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#8 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(144): Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer::analyzeAssignmentOperation()
#9 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(40): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#10 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(530): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#11 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(172): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement()
#12 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchCaseAnalyzer.php(459): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze()
#13 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Block/SwitchAnalyzer.php(114): Psalm\Internal\Analyzer\Statements\Block\SwitchCaseAnalyzer::analyze()
#14 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(510): Psalm\Internal\Analyzer\Statements\Block\SwitchAnalyzer::analyze()
#15 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(172): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement()
#16 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php(416): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze()
#17 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php(126): Psalm\Internal\Analyzer\FunctionLikeAnalyzer->analyze()
#18 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php(420): Psalm\Internal\Analyzer\ClassLikeAnalyzer->getMethodMutations()
#19 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(1384): Psalm\Internal\Analyzer\FileAnalyzer->getMethodMutations()
#20 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php(224): Psalm\Internal\Analyzer\ProjectAnalyzer->getMethodMutations()
#21 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php(135): Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer::collectSpecialInformation()
#22 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php(401): Psalm\Internal\Analyzer\Statements\Expression\Call\Method\ExistingAtomicMethodCallAnalyzer::analyze()
#23 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php(184): Psalm\Internal\Analyzer\Statements\Expression\Call\Method\AtomicMethodCallAnalyzer::analyze()
#24 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(148): Psalm\Internal\Analyzer\Statements\Expression\Call\MethodCallAnalyzer::analyze()
#25 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(40): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#26 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CastAnalyzer.php(42): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#27 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(297): Psalm\Internal\Analyzer\Statements\Expression\CastAnalyzer::analyze()
#28 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(40): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#29 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php(195): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#30 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(129): Psalm\Internal\Analyzer\Statements\Expression\AssignmentAnalyzer::analyze()
#31 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(40): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#32 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(530): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#33 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(172): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement()
#34 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php(416): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze()
#35 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php(126): Psalm\Internal\Analyzer\FunctionLikeAnalyzer->analyze()
#36 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php(420): Psalm\Internal\Analyzer\ClassLikeAnalyzer->getMethodMutations()
#37 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(1384): Psalm\Internal\Analyzer\FileAnalyzer->getMethodMutations()
#38 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/CallAnalyzer.php(224): Psalm\Internal\Analyzer\ProjectAnalyzer->getMethodMutations()
#39 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/ExistingAtomicMethodCallAnalyzer.php(135): Psalm\Internal\Analyzer\Statements\Expression\CallAnalyzer::collectSpecialInformation()
#40 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/Method/AtomicMethodCallAnalyzer.php(401): Psalm\Internal\Analyzer\Statements\Expression\Call\Method\ExistingAtomicMethodCallAnalyzer::analyze()
#41 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/MethodCallAnalyzer.php(184): Psalm\Internal\Analyzer\Statements\Expression\Call\Method\AtomicMethodCallAnalyzer::analyze()
#42 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(148): Psalm\Internal\Analyzer\Statements\Expression\Call\MethodCallAnalyzer::analyze()
#43 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(40): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#44 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(530): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#45 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(172): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement()
#46 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php(416): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze()
#47 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassLikeAnalyzer.php(126): Psalm\Internal\Analyzer\FunctionLikeAnalyzer->analyze()
#48 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php(420): Psalm\Internal\Analyzer\ClassLikeAnalyzer->getMethodMutations()
#49 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(1384): Psalm\Internal\Analyzer\FileAnalyzer->getMethodMutations()
#50 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php(387): Psalm\Internal\Analyzer\ProjectAnalyzer->getMethodMutations()
#51 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/ExistingAtomicStaticCallAnalyzer.php(111): Psalm\Internal\Analyzer\FileAnalyzer->getMethodMutations()
#52 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php(727): Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\ExistingAtomicStaticCallAnalyzer::analyze()
#53 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticMethod/AtomicStaticCallAnalyzer.php(177): Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\AtomicStaticCallAnalyzer::handleNamedCall()
#54 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/StaticCallAnalyzer.php(205): Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\AtomicStaticCallAnalyzer::analyze()
#55 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(152): Psalm\Internal\Analyzer\Statements\Expression\Call\StaticCallAnalyzer::analyze()
#56 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(40): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#57 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(530): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#58 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(172): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement()
#59 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php(416): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze()
#60 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php(1139): Psalm\Internal\Analyzer\FunctionLikeAnalyzer->analyze()
#61 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php(502): Psalm\Internal\Analyzer\ClassAnalyzer->checkPropertyInitialization()
#62 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php(213): Psalm\Internal\Analyzer\ClassAnalyzer->analyze()
#63 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(340): Psalm\Internal\Analyzer\FileAnalyzer->analyze()
#64 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(193): Psalm\Internal\Codebase\Analyzer->Psalm\Internal\Codebase\{closure}()
#65 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(406): Psalm\Internal\Fork\Pool->__construct()
#66 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(269): Psalm\Internal\Codebase\Analyzer->doAnalysis()
#67 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(636): Psalm\Internal\Codebase\Analyzer->analyzeFiles()
#68 /var/www/test1/vendor/vimeo/psalm/src/psalm.php(683): Psalm\Internal\Analyzer\ProjectAnalyzer->check()
#69 /var/www/test1/vendor/vimeo/psalm/psalm(2): require_once('...')
#70 {main} in /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php:357
Stack trace:
#0 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(389): Psalm\Internal\Fork\Pool->readResultsFromChildren()
#1 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(473): Psalm\Internal\Fork\Pool->wait()
#2 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(269): Psalm\Internal\Codebase\Analyzer->doAnalysis()
#3 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(636): Psalm\Internal\Codebase\Analyzer->analyzeFiles()
#4 /var/www/test1/vendor/vimeo/psalm/src/psalm.php(683): Psalm\Internal\Analyzer\ProjectAnalyzer->check()
#5 /var/www/test1/vendor/vimeo/psalm/psalm(2): require_once('...')
#6 {main}
(Psalm 4.6.2@bca09d74adc704c4eaee36a3c3e9d379e290fc3b crashed due to an uncaught Throwable)

PHP 8.0.2 Ubuntu 20.04.2 LTS

@psalm-github-bot
Copy link

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

@orklah
Copy link
Collaborator

orklah commented Mar 10, 2021

Oh, tricky, Just to be sure, could you run with --debug-by-line and try to figure out the expression that fail?

It seems to be a multiplication between two literal integers that would result into a float (kinda like https://3v4l.org/hjE8h) due to a result too big to fit an integer

For reference, the error comes from:

$calculated_type = Type::getInt(false, $left_type_part->value * $right_type_part->value);

@johnny-silverhand
Copy link
Author

Hello @orklah,

I tried with --debug-by-line parameter. After few hours of scanning the command is stand without any output at "Gathering data for forked process". Not sure what is going wrong.

@orklah
Copy link
Collaborator

orklah commented Mar 11, 2021

oh. Can you try again with --threads=1 ? No need to let it run for too long, it should output a lot of debug, but if it's stops and hang, you can terminate the execution, it's not normal

@johnny-silverhand
Copy link
Author

user@dev:/var/www/test1$ ./vendor/bin/psalm --init --threads=1
Calculating best config level based on project files
Uncaught Psalm\Exception\ConfigCreationException: The given path "/var/www/test1//--threads=1" does not appear to be a directory in /var/www/test1/vendor/vimeo/psalm/src/Psalm/Config/Creator.php:169
Stack trace:
#0 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Config/Creator.php(55): Psalm\Config\Creator::getPaths()
#1 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Config/Creator.php(91): Psalm\Config\Creator::getContents()
#2 /var/www/test1/vendor/vimeo/psalm/src/psalm.php(344): Psalm\Config\Creator::createBareConfig()
#3 /var/www/test1/vendor/vimeo/psalm/psalm(2): require_once('...')
#4 {main}
(Psalm 4.6.2@bca09d74adc704c4eaee36a3c3e9d379e290fc3b crashed due to an uncaught Throwable)

@johnny-silverhand
Copy link
Author

after configure, i got these log

...
/var/www/test1/protected/extensions/phpQuery/phpQuery/phpQuery/Zend/Validate/File/Size.php:258
/var/www/test1/protected/extensions/phpQuery/phpQuery/phpQuery/Zend/Validate/File/Size.php:259
/var/www/test1/protected/extensions/phpQuery/phpQuery/phpQuery/Zend/Validate/File/Size.php:260
/var/www/test1/protected/extensions/phpQuery/phpQuery/phpQuery/Zend/Validate/File/Size.php:262
Uncaught TypeError: Psalm\Type::getInt(): Argument #2 ($value) must be of type ?int, float given, called in /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonDivArithmeticOpAnalyzer.php on line 315 and defined in /var/www/test1/vendor/vimeo/psalm/src/Psalm/Type.php:164
Stack trace:
#0 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonDivArithmeticOpAnalyzer.php(315): Psalm\Type::getInt()
#1 /var/www/test1/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOp/NonDivArithmeticOpAnalyzer.php(183): Psalm\Internal\Analyzer\Statements\Expression\BinaryOp\NonDivArithmeticOpAnalyzer::analyzeNonDivOperands()
....

@johnny-silverhand
Copy link
Author

@orklah breaks down on this code

    protected function _fromByteString($size) 
    {
        if (is_numeric($size)) {
            return (integer) $size;
        }

        $type  = trim(substr($size, -2));
        $value = substr($size, 0, -2);
        switch (strtoupper($type)) {
            case 'YB':
                $value *= (1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024);
                break;
            case 'ZB':
                $value *= (1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024);
                break;
            case 'EB':
                $value *= (1024 * 1024 * 1024 * 1024 * 1024 * 1024);
                break;
            case 'PB':
                $value *= (1024 * 1024 * 1024 * 1024 * 1024);
                break;
            case 'TB':
                $value *= (1024 * 1024 * 1024 * 1024);
                break;
            case 'GB':
                $value *= (1024 * 1024 * 1024);
                break;
            case 'MB':
                $value *= (1024 * 1024);
                break;
            case 'KB':
                $value *= 1024;
                break;
            default:
                break;
        }
        return $value;
    }

@orklah
Copy link
Collaborator

orklah commented Mar 11, 2021

Thanks, it's confirmed then: https://3v4l.org/kDgcl

This multiplication is way too big to fit into an integer so PHP fallback into a float.

I'll try to fix that this afternoon

@weirdan
Copy link
Collaborator

weirdan commented Mar 11, 2021

Who knew PHP could handle yottabytes 🤯

@orklah
Copy link
Collaborator

orklah commented Mar 11, 2021

The PR should fix Psalm and help it understands the result is a float. However, I'm not sure how your code would behave if you go beyond 8EB. The result will be a imprecise float and it may cause issues.

Maybe you should use bc* functions for this kind of uses.

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.

3 participants