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

Non-UTF-8 encoded string causes RuntimeException #5945

Closed
janxyz opened this issue Jun 17, 2021 · 2 comments
Closed

Non-UTF-8 encoded string causes RuntimeException #5945

janxyz opened this issue Jun 17, 2021 · 2 comments

Comments

@janxyz
Copy link

janxyz commented Jun 17, 2021

Hi, I get the following error when running psalm.

Uncaught RuntimeException: PHP Error: Invalid argument supplied for foreach() in /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php:149 in /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/ErrorHandler.php:66
Stack trace:
#0 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php(149): Psalm\Internal\ErrorHandler::Psalm\Internal\{closure}()
#1 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php(785): Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentAnalyzer::checkArgumentMatches()
#2 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/Call/FunctionCallAnalyzer.php(184): Psalm\Internal\Analyzer\Statements\Expression\Call\ArgumentsAnalyzer::checkArgumentsMatch()
#3 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(260): Psalm\Internal\Analyzer\Statements\Expression\Call\FunctionCallAnalyzer::analyze()
#4 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(40): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#5 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/Expression/BinaryOpAnalyzer.php(100): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#6 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(228): Psalm\Internal\Analyzer\Statements\Expression\BinaryOpAnalyzer::analyze()
#7 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ExpressionAnalyzer.php(40): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression()
#8 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php(146): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze()
#9 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(504): Psalm\Internal\Analyzer\Statements\ReturnAnalyzer::analyze()
#10 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php(172): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement()
#11 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php(430): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze()
#12 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php(1776): Psalm\Internal\Analyzer\FunctionLikeAnalyzer->analyze()
#13 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php(401): Psalm\Internal\Analyzer\ClassAnalyzer->analyzeClassMethod()
#14 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php(213): Psalm\Internal\Analyzer\ClassAnalyzer->analyze()
#15 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(341): Psalm\Internal\Analyzer\FileAnalyzer->analyze()
#16 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(580): Psalm\Internal\Codebase\Analyzer->Psalm\Internal\Codebase\{closure}()
#17 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(270): Psalm\Internal\Codebase\Analyzer->doAnalysis()
#18 /home/foobar/.config/composer/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(636): Psalm\Internal\Codebase\Analyzer->analyzeFiles()
#19 /home/foobar/.config/composer/vendor/vimeo/psalm/src/psalm.php(700): Psalm\Internal\Analyzer\ProjectAnalyzer->check()
#20 /home/foobar/.config/composer/vendor/vimeo/psalm/src/psalm.php(884): Psalm\{closure}()
#21 /home/foobar/.config/composer/vendor/vimeo/psalm/psalm(2): require_once('/home/foobar/.co...')
#22 {main}
(Psalm 4.7.2@83a0325c0a95c0ab531d6b90c877068b464377b5 crashed due to an uncaught Throwable)

$values = \preg_split('//u', $arg_value_type->getSingleStringLiteral()->value, -1, \PREG_SPLIT_NO_EMPTY);
$prev_ord = 0;
$gt_count = 0;
foreach ($values as $value) {
$ord = \ord($value);
if ($ord > $prev_ord) {
$gt_count++;
}
$prev_ord = $ord;
}

The cause was a non-UTF-8 encoded string that was used as a first argument for mb_strpos. I guess the solution would be to check if the return value of preg_split is false. I would like to create a PR for this but I don't know if a false value should count as an InvalidLiteralArgument error or not.

@psalm-github-bot
Copy link

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

@muglug
Copy link
Collaborator

muglug commented Jun 17, 2021

I would like to create a PR for this but I don't know if a false value should count as an InvalidLiteralArgument error or not.

I think it's ok to not perform this check in this rare circumstance

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

No branches or pull requests

3 participants