diff --git a/dictionaries/InternalTaintSinkMap.php b/dictionaries/InternalTaintSinkMap.php index cb8c6077d35..574312991a3 100644 --- a/dictionaries/InternalTaintSinkMap.php +++ b/dictionaries/InternalTaintSinkMap.php @@ -5,7 +5,7 @@ // This maps internal function names to sink types that we don’t want to end up there /** - * @var array>> + * @var non-empty-array>> */ return [ 'exec' => [['shell']], diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 3cc1e338550..2aa83e33ad9 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -137,7 +137,6 @@ $args[0] $args[0] $args[1] - $callmap_callables[0] $method_name @@ -257,17 +256,6 @@ $stub - - - $callables[0] - $callables[0] - - - - - $function_callables[0] - - $property_name diff --git a/src/Psalm/Internal/Codebase/InternalCallMapHandler.php b/src/Psalm/Internal/Codebase/InternalCallMapHandler.php index f0cf35261f4..71ce092eae9 100644 --- a/src/Psalm/Internal/Codebase/InternalCallMapHandler.php +++ b/src/Psalm/Internal/Codebase/InternalCallMapHandler.php @@ -43,19 +43,19 @@ class InternalCallMapHandler private static ?int $loaded_php_minor_version = null; /** - * @var array>|null + * @var non-empty-array>|null */ private static ?array $call_map = null; /** - * @var array>|null + * @var array>|null */ private static ?array $call_map_callables = []; /** - * @var array>> + * @var non-empty-array>>|null */ - private static array $taint_sink_map = []; + private static ?array $taint_sink_map = null; /** * @param list $args @@ -84,7 +84,7 @@ public static function getCallableFromCallMapById( } /** - * @param array $callables + * @param non-empty-list $callables * @param list $args */ public static function getMatchingCallableFromCallMapOptions( @@ -216,7 +216,7 @@ public static function getMatchingCallableFromCallMapOptions( } /** - * @return list|null + * @return non-empty-list|null */ public static function getCallablesFromCallMap(string $function_id): ?array { @@ -332,7 +332,9 @@ public static function getCallablesFromCallMap(string $function_id): ?array /** * Gets the method/function call map * - * @return array> + * @return non-empty-array> + * @psalm-assert !null self::$taint_sink_map + * @psalm-assert !null self::$call_map */ public static function getCallMap(): array { @@ -353,26 +355,31 @@ public static function getCallMap(): array return self::$call_map; } - /** @var array> */ - $call_map = require(dirname(__DIR__, 4) . '/dictionaries/CallMap.php'); + /** @var non-empty-array> */ + $call_map_data = require(dirname(__DIR__, 4) . '/dictionaries/CallMap.php'); - self::$call_map = []; + $call_map = []; - foreach ($call_map as $key => $value) { + foreach ($call_map_data as $key => $value) { $cased_key = strtolower($key); - self::$call_map[$cased_key] = $value; + $call_map[$cased_key] = $value; } + self::$call_map = $call_map; + /** - * @var array>> + * @var non-empty-array>> */ - $taint_map = require(dirname(__DIR__, 4) . '/dictionaries/InternalTaintSinkMap.php'); + $taint_map_data = require(dirname(__DIR__, 4) . '/dictionaries/InternalTaintSinkMap.php'); - foreach ($taint_map as $key => $value) { + $taint_map = []; + foreach ($taint_map_data as $key => $value) { $cased_key = strtolower($key); - self::$taint_sink_map[$cased_key] = $value; + $taint_map[$cased_key] = $value; } + self::$taint_sink_map = $taint_map; + if (version_compare($analyzer_version, $current_version, '<')) { // the following assumes both minor and major versions a single digits for ($i = $current_version_int; $i > $analyzer_version_int && $i >= self::LOWEST_AVAILABLE_DELTA; --$i) { @@ -408,6 +415,7 @@ public static function getCallMap(): array } } } + assert(!empty(self::$call_map)); self::$loaded_php_major_version = $analyzer_major_version; self::$loaded_php_minor_version = $analyzer_minor_version;