diff --git a/src/Cache/Cache.php b/src/Cache/Cache.php
index 8f4deb6f13..9b888cf67a 100644
--- a/src/Cache/Cache.php
+++ b/src/Cache/Cache.php
@@ -17,6 +17,8 @@ public function __construct(
 	}
 
 	/**
+	 * @param non-empty-string $key
+	 *
 	 * @return mixed|null
 	 */
 	public function load(string $key, string $variableKey)
@@ -25,6 +27,8 @@ public function load(string $key, string $variableKey)
 	}
 
 	/**
+	 * @param non-empty-string $key
+	 *
 	 * @param mixed $data
 	 */
 	public function save(string $key, string $variableKey, $data): void
diff --git a/src/Cache/CacheStorage.php b/src/Cache/CacheStorage.php
index c3a645eb2b..4ac0a3dd87 100644
--- a/src/Cache/CacheStorage.php
+++ b/src/Cache/CacheStorage.php
@@ -6,11 +6,15 @@ interface CacheStorage
 {
 
 	/**
+	 * @param non-empty-string $key
+	 *
 	 * @return mixed|null
 	 */
 	public function load(string $key, string $variableKey);
 
 	/**
+	 * @param non-empty-string $key
+	 *
 	 * @param mixed $data
 	 */
 	public function save(string $key, string $variableKey, $data): void;
diff --git a/src/Cache/FileCacheStorage.php b/src/Cache/FileCacheStorage.php
index 1b66f26e2a..efe681a95f 100644
--- a/src/Cache/FileCacheStorage.php
+++ b/src/Cache/FileCacheStorage.php
@@ -101,6 +101,8 @@ public function save(string $key, string $variableKey, $data): void
 	}
 
 	/**
+	 * @param non-empty-string $key
+	 *
 	 * @return array{string, string, string}
 	 */
 	private function getFilePaths(string $key): array
diff --git a/src/Command/ErrorFormatter/BaselinePhpErrorFormatter.php b/src/Command/ErrorFormatter/BaselinePhpErrorFormatter.php
index 892a3e1eb2..ac4c1fc81f 100644
--- a/src/Command/ErrorFormatter/BaselinePhpErrorFormatter.php
+++ b/src/Command/ErrorFormatter/BaselinePhpErrorFormatter.php
@@ -87,7 +87,7 @@ public function formatErrors(
 				if (count($identifiers) > 0) {
 					foreach ($identifiers as $identifier => $identifierCount) {
 						$php .= sprintf(
-							"\$ignoreErrors[] = [\n\t%s => %s,\n\t'identifier' => %s,\n\t'count' => %d,\n\t'path' => __DIR__ . %s,\n];\n",
+							"\$ignoreErrors[] = [\n\t%s => %s,\n\t'identifier' => %s,\n\t'count' => %s,\n\t'path' => __DIR__ . %s,\n];\n",
 							var_export($messageKey, true),
 							var_export(Helpers::escape($message), true),
 							var_export(Helpers::escape($identifier), true),
@@ -97,7 +97,7 @@ public function formatErrors(
 					}
 				} else {
 					$php .= sprintf(
-						"\$ignoreErrors[] = [\n\t%s => %s,\n\t'count' => %d,\n\t'path' => __DIR__ . %s,\n];\n",
+						"\$ignoreErrors[] = [\n\t%s => %s,\n\t'count' => %s,\n\t'path' => __DIR__ . %s,\n];\n",
 						var_export($messageKey, true),
 						var_export(Helpers::escape($message), true),
 						var_export($totalCount, true),
diff --git a/src/Command/ErrorFormatter/CheckstyleErrorFormatter.php b/src/Command/ErrorFormatter/CheckstyleErrorFormatter.php
index 8120dea1ef..6a8c27b122 100644
--- a/src/Command/ErrorFormatter/CheckstyleErrorFormatter.php
+++ b/src/Command/ErrorFormatter/CheckstyleErrorFormatter.php
@@ -44,7 +44,7 @@ public function formatErrors(
 
 			foreach ($errors as $error) {
 				$output->writeRaw(sprintf(
-					'  ',
+					'  ',
 					$this->escape((string) $error->getLine()),
 					$this->escape($error->getMessage()),
 					$error->getIdentifier() !== null ? sprintf(' source="%s"', $this->escape($error->getIdentifier())) : '',
diff --git a/src/Command/ErrorFormatter/RawErrorFormatter.php b/src/Command/ErrorFormatter/RawErrorFormatter.php
index a37dc42129..efd770468d 100644
--- a/src/Command/ErrorFormatter/RawErrorFormatter.php
+++ b/src/Command/ErrorFormatter/RawErrorFormatter.php
@@ -30,7 +30,7 @@ public function formatErrors(
 
 			$output->writeRaw(
 				sprintf(
-					'%s:%d:%s%s',
+					'%s:%s:%s%s',
 					$fileSpecificError->getFile(),
 					$fileSpecificError->getLine() ?? '?',
 					$fileSpecificError->getMessage(),
diff --git a/src/Command/ErrorFormatter/TableErrorFormatter.php b/src/Command/ErrorFormatter/TableErrorFormatter.php
index bf79a7dc5f..cbea7e6bfa 100644
--- a/src/Command/ErrorFormatter/TableErrorFormatter.php
+++ b/src/Command/ErrorFormatter/TableErrorFormatter.php
@@ -64,8 +64,8 @@ public function formatErrors(
 					$output->writeLineFormatted('💡 Tip of the Day:');
 					$output->writeLineFormatted(sprintf(
 						"PHPStan is performing only the most basic checks.\nYou can pass a higher rule level through the --%s> option\n(the default and current level is %d) to analyse code more thoroughly.",
-						AnalyseCommand::OPTION_LEVEL,
-						AnalyseCommand::DEFAULT_LEVEL,
+						(int) AnalyseCommand::OPTION_LEVEL,
+						(int) AnalyseCommand::DEFAULT_LEVEL,
 					));
 					$output->writeLineFormatted('');
 				}
@@ -111,7 +111,7 @@ public function formatErrors(
 
 				if (getenv('TERMINAL_EMULATOR') === 'JetBrains-JediTerm') {
 					$title = $this->relativePathHelper->getRelativePath($filePath);
-					$message .= sprintf("\nat %s:%d", $title, $error->getLine());
+					$message .= sprintf("\nat %s:%d", $title, $error->getLine() ?? 0);
 
 				} elseif (is_string($this->editorUrl)) {
 					$url = str_replace(
diff --git a/src/Command/FixerWorkerCommand.php b/src/Command/FixerWorkerCommand.php
index aedb4bf858..fbb811917d 100644
--- a/src/Command/FixerWorkerCommand.php
+++ b/src/Command/FixerWorkerCommand.php
@@ -130,7 +130,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
 
 		$loop = new StreamSelectLoop();
 		$tcpConnector = new TcpConnector($loop);
-		$tcpConnector->connect(sprintf('127.0.0.1:%d', $serverPort))->then(function (ConnectionInterface $connection) use ($container, $inceptionResult, $configuration, $input, $ignoredErrorHelperResult, $loop): void {
+		$tcpConnector->connect(sprintf('127.0.0.1:%d', (int) $serverPort))->then(function (ConnectionInterface $connection) use ($container, $inceptionResult, $configuration, $input, $ignoredErrorHelperResult, $loop): void {
 			// phpcs:disable SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly
 			$jsonInvalidUtf8Ignore = defined('JSON_INVALID_UTF8_IGNORE') ? JSON_INVALID_UTF8_IGNORE : 0;
 			// phpcs:enable
diff --git a/src/Command/WorkerCommand.php b/src/Command/WorkerCommand.php
index dfef585109..902c9055a2 100644
--- a/src/Command/WorkerCommand.php
+++ b/src/Command/WorkerCommand.php
@@ -142,7 +142,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
 		$analysedFiles = array_fill_keys($analysedFiles, true);
 
 		$tcpConnector = new TcpConnector($loop);
-		$tcpConnector->connect(sprintf('127.0.0.1:%d', $port))->then(function (ConnectionInterface $connection) use ($container, $identifier, $output, $analysedFiles, $tmpFile, $insteadOfFile): void {
+		$tcpConnector->connect(sprintf('127.0.0.1:%d', (int) $port))->then(function (ConnectionInterface $connection) use ($container, $identifier, $output, $analysedFiles, $tmpFile, $insteadOfFile): void {
 			// phpcs:disable SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly
 			$jsonInvalidUtf8Ignore = defined('JSON_INVALID_UTF8_IGNORE') ? JSON_INVALID_UTF8_IGNORE : 0;
 			// phpcs:enable
diff --git a/src/Reflection/Php/PhpMethodReflection.php b/src/Reflection/Php/PhpMethodReflection.php
index 3c4aafdd60..c6e5140cfb 100644
--- a/src/Reflection/Php/PhpMethodReflection.php
+++ b/src/Reflection/Php/PhpMethodReflection.php
@@ -255,7 +255,14 @@ private function isVariadic(): bool
 
 			$className = $declaringClass->getName();
 			if ($declaringClass->isAnonymous()) {
-				$className = sprintf('%s:%s:%s', VariadicMethodsVisitor::ANONYMOUS_CLASS_PREFIX, $declaringClass->getNativeReflection()->getStartLine(), $declaringClass->getNativeReflection()->getEndLine());
+				$startLine = $declaringClass->getNativeReflection()->getStartLine();
+				$endLine = $declaringClass->getNativeReflection()->getEndLine();
+
+				if ($endLine === false) {
+					$endLine = 0;
+				}
+
+				$className = sprintf('%s:%s:%s', VariadicMethodsVisitor::ANONYMOUS_CLASS_PREFIX, $startLine, $endLine);
 			}
 			if (array_key_exists($className, VariadicMethodsVisitor::$cache)) {
 				if (array_key_exists($this->reflection->getName(), VariadicMethodsVisitor::$cache[$className])) {
diff --git a/src/Testing/PHPStanTestCase.php b/src/Testing/PHPStanTestCase.php
index 5749b34e44..5cdd02383d 100644
--- a/src/Testing/PHPStanTestCase.php
+++ b/src/Testing/PHPStanTestCase.php
@@ -219,7 +219,7 @@ protected function assertNoErrors(array $errors): void
 			$messages = [];
 			foreach ($errors as $error) {
 				if ($error instanceof Error) {
-					$messages[] = sprintf("- %s\n  in %s on line %d\n", rtrim($error->getMessage(), '.'), $error->getFile(), $error->getLine());
+					$messages[] = sprintf("- %s\n  in %s on line %d\n", rtrim($error->getMessage(), '.'), $error->getFile(), $error->getLine() ?? 0);
 				} else {
 					$messages[] = $error;
 				}
diff --git a/src/Testing/RuleTestCase.php b/src/Testing/RuleTestCase.php
index 47c8a997e9..6aebd5e904 100644
--- a/src/Testing/RuleTestCase.php
+++ b/src/Testing/RuleTestCase.php
@@ -258,7 +258,7 @@ private function gatherAnalyserErrorsWithDelayedErrors(array $files): array
 
 		if ($this->shouldFailOnPhpErrors() && count($analyserResult->getAllPhpErrors()) > 0) {
 			$this->fail(implode("\n", array_map(
-				static fn (Error $error): string => sprintf('%s on %s:%d', $error->getMessage(), $error->getFile(), $error->getLine()),
+				static fn (Error $error): string => sprintf('%s on %s:%d', $error->getMessage(), $error->getFile(), $error->getLine() ?? 0),
 				$analyserResult->getAllPhpErrors(),
 			)));
 		}