Skip to content

Commit

Permalink
more
Browse files Browse the repository at this point in the history
  • Loading branch information
kkmuffme committed Mar 22, 2024
1 parent 3319024 commit e145b0d
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -351,18 +351,15 @@ private static function analyzeArrayItem(
}

if ($item->key instanceof PhpParser\Node\Scalar\String_
&& preg_match('/^(0|[1-9][0-9]*)$/', $item->key->value)
&& (
(int) $item->key->value < PHP_INT_MAX ||
$item->key->value === (string) PHP_INT_MAX
)
&& ArrayAnalyzer::getLiteralArrayKeyInt($item->key->value)

Check failure on line 354 in src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php

View workflow job for this annotation

GitHub Actions / build

RiskyTruthyFalsyComparison

src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php:354:24: RiskyTruthyFalsyComparison: Operand of type false|int contains type int, which can be falsy and truthy. This can cause possibly unexpected behavior. Use strict comparison instead. (see https://psalm.dev/356)
) {
$key_type = Type::getInt(false, (int) $item->key->value);
}

if ($key_type->isSingleStringLiteral()) {
$item_key_literal_type = $key_type->getSingleStringLiteral();
$item_key_value = $item_key_literal_type->value;
$string_to_int = ArrayAnalyzer::getLiteralArrayKeyInt($item_key_literal_type->value);
$item_key_value = $string_to_int === false ? $item_key_literal_type->value : $string_to_int;

if ($item_key_literal_type instanceof TLiteralClassString) {
$array_creation_info->class_strings[$item_key_value] = true;

Check failure on line 365 in src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php

View workflow job for this annotation

GitHub Actions / build

InvalidPropertyAssignmentValue

src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php:365:25: InvalidPropertyAssignmentValue: $array_creation_info->class_strings with declared type 'array<string, true>' cannot be assigned type 'non-empty-array<int|string, true>' (see https://psalm.dev/145)
Expand Down Expand Up @@ -434,9 +431,17 @@ private static function analyzeArrayItem(
) {
$var_location = new CodeLocation($statements_analyzer->getSource(), $item);

$access = '';
if (is_int($item_key_value)) {
$literal_key = $item_key_value;
$access = '[' . $item_key_value . ']';
} elseif ($item_key_value !== null) {
$literal_key = '\'' . $item_key_value . '\'';
$access = '[\'' . $item_key_value . '\']';
}

$new_parent_node = DataFlowNode::getForAssignment(
'array'
. ($item_key_value !== null ? '[\'' . $item_key_value . '\']' : ''),
'array' . $access,
$var_location,
);

Expand All @@ -452,7 +457,7 @@ private static function analyzeArrayItem(
$parent_node,
$new_parent_node,
'arrayvalue-assignment'
. ($item_key_value !== null ? '-\'' . $item_key_value . '\'' : ''),
. ($item_key_value !== null ? '-' . $literal_key : ''),

Check failure on line 460 in src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php

View workflow job for this annotation

GitHub Actions / build

PossiblyUndefinedVariable

src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php:460:69: PossiblyUndefinedVariable: Possibly undefined variable $literal_key, first seen on line 436 (see https://psalm.dev/018)

Check failure on line 460 in src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php

View workflow job for this annotation

GitHub Actions / build

MixedOperand

src/Psalm/Internal/Analyzer/Statements/Expression/ArrayAnalyzer.php:460:69: MixedOperand: Right operand cannot be mixed (see https://psalm.dev/059)
$added_taints,
$removed_taints,
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1217,6 +1217,13 @@ private static function analyzeDestructuringAssignment(
$offset_value = $assign_var_item->key->value;
}

if ($offset_value !== null) {
$string_to_int = ArrayAnalyzer::getLiteralArrayKeyInt($offset_value);
if ($string_to_int !== false) {
$offset_value = $string_to_int;
}
}

$list_var_id = ExpressionIdentifier::getExtendedVarId(
$var,
$statements_analyzer->getFQCLN(),
Expand Down Expand Up @@ -1265,11 +1272,18 @@ private static function analyzeDestructuringAssignment(

$keyed_array_var_id = null;

if (is_string($offset_value)) {
$temp = Type::getString($offset_value);
$literal_access = '\'' . $offset_value . '\'';
} else {
$temp = Type::getInt($offset_value);

Check failure on line 1279 in src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php

View workflow job for this annotation

GitHub Actions / build

InvalidScalarArgument

src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php:1279:54: InvalidScalarArgument: Argument 1 of Psalm\Type::getInt expects bool, but int provided (see https://psalm.dev/012)
$literal_access = $offset_value;
}

if ($assign_value_id) {
$keyed_array_var_id = $assign_value_id . '[\'' . $offset_value . '\']';
$keyed_array_var_id = $assign_value_id . '[' . $literal_access . ']';
}

$temp = Type::getString((string) $offset_value);
ArrayFetchAnalyzer::taintArrayFetch(
$statements_analyzer,
$assign_value,
Expand Down

0 comments on commit e145b0d

Please sign in to comment.