From 4d8af74d929225881d4a69c36c5c1f25f3051156 Mon Sep 17 00:00:00 2001 From: Bruce Weirdan Date: Sat, 3 Dec 2022 00:51:22 -0400 Subject: [PATCH] Don't crash when accessing immutable static property Fixes vimeo/psalm#8313 --- .../InstancePropertyAssignmentAnalyzer.php | 18 ++++++++++-------- tests/UnusedCodeTest.php | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php index f5c2000bac8..d69df245442 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/Assignment/InstancePropertyAssignmentAnalyzer.php @@ -524,17 +524,19 @@ private static function taintProperty( } } - $stmt_var_type = $context->vars_in_scope[$var_id]->setParentNodes( - [$var_node->id => $var_node] - ); + if (isset($context->vars_in_scope[$var_id])) { + $stmt_var_type = $context->vars_in_scope[$var_id]->setParentNodes( + [$var_node->id => $var_node] + ); - if ($context->vars_in_scope[$var_id]->parent_nodes) { - foreach ($context->vars_in_scope[$var_id]->parent_nodes as $parent_node) { - $data_flow_graph->addPath($parent_node, $var_node, '=', $added_taints, $removed_taints); + if ($context->vars_in_scope[$var_id]->parent_nodes) { + foreach ($context->vars_in_scope[$var_id]->parent_nodes as $parent_node) { + $data_flow_graph->addPath($parent_node, $var_node, '=', $added_taints, $removed_taints); + } } - } - $context->vars_in_scope[$var_id] = $stmt_var_type; + $context->vars_in_scope[$var_id] = $stmt_var_type; + } } } else { if ($statements_analyzer->data_flow_graph instanceof TaintFlowGraph diff --git a/tests/UnusedCodeTest.php b/tests/UnusedCodeTest.php index a7aff4e56e8..9398e66f68a 100644 --- a/tests/UnusedCodeTest.php +++ b/tests/UnusedCodeTest.php @@ -1742,6 +1742,21 @@ function f(): void { ', 'error_message' => 'UnevaluatedCode', ], + 'noCrashOnReadonlyStaticProp' => [ + 'code' => 'val = 1; + } + } + ', + 'error_message' => 'InaccessibleProperty', + ], ]; } }