From 8b5f94d71b0ed9ec089f569971a87a04474c4911 Mon Sep 17 00:00:00 2001 From: Jean-Luc Herren Date: Sun, 17 Oct 2021 12:05:41 +0200 Subject: [PATCH] Mark file resource functions as having side effects Fixes phpstan/phpstan#5461 --- bin/functionMetadata_original.php | 38 +++++++++++ resources/functionMetadata.php | 38 +++++++++++ .../Analyser/NodeScopeResolverTest.php | 2 + .../Analyser/data/filesystem-functions.php | 68 +++++++++++++++++++ 4 files changed, 146 insertions(+) create mode 100644 tests/PHPStan/Analyser/data/filesystem-functions.php diff --git a/bin/functionMetadata_original.php b/bin/functionMetadata_original.php index b7505a6f6f..8004c6dcda 100644 --- a/bin/functionMetadata_original.php +++ b/bin/functionMetadata_original.php @@ -61,8 +61,46 @@ 'bcmod' => ['hasSideEffects' => false], 'bcmul' => ['hasSideEffects' => false], // continue functionMap.php, line 424 + 'chgrp' => ['hasSideEffects' => true], + 'chmod' => ['hasSideEffects' => true], + 'chown' => ['hasSideEffects' => true], + 'copy' => ['hasSideEffects' => true], 'count' => ['hasSideEffects' => false], + 'fclose' => ['hasSideEffects' => true], + 'fflush' => ['hasSideEffects' => true], + 'fgetc' => ['hasSideEffects' => true], + 'fgetcsv' => ['hasSideEffects' => true], + 'fgets' => ['hasSideEffects' => true], + 'fgetss' => ['hasSideEffects' => true], + 'file_put_contents' => ['hasSideEffects' => true], + 'flock' => ['hasSideEffects' => true], + 'fopen' => ['hasSideEffects' => true], + 'fpassthru' => ['hasSideEffects' => true], + 'fputcsv' => ['hasSideEffects' => true], + 'fputs' => ['hasSideEffects' => true], + 'fread' => ['hasSideEffects' => true], + 'fscanf' => ['hasSideEffects' => true], + 'fseek' => ['hasSideEffects' => true], + 'ftruncate' => ['hasSideEffects' => true], + 'fwrite' => ['hasSideEffects' => true], + 'lchgrp' => ['hasSideEffects' => true], + 'lchown' => ['hasSideEffects' => true], + 'link' => ['hasSideEffects' => true], + 'mkdir' => ['hasSideEffects' => true], + 'move_uploaded_file' => ['hasSideEffects' => true], + 'pclose' => ['hasSideEffects' => true], + 'popen' => ['hasSideEffects' => true], + 'readfile' => ['hasSideEffects' => true], + 'rename' => ['hasSideEffects' => true], + 'rewind' => ['hasSideEffects' => true], + 'rmdir' => ['hasSideEffects' => true], 'sprintf' => ['hasSideEffects' => false], + 'symlink' => ['hasSideEffects' => true], + 'tempnam' => ['hasSideEffects' => true], + 'tmpfile' => ['hasSideEffects' => true], + 'touch' => ['hasSideEffects' => true], + 'umask' => ['hasSideEffects' => true], + 'unlink' => ['hasSideEffects' => true], // random functions, do not have side effects but are not deterministic 'mt_rand' => ['hasSideEffects' => true], diff --git a/resources/functionMetadata.php b/resources/functionMetadata.php index e3f29358af..37ac4d49ce 100644 --- a/resources/functionMetadata.php +++ b/resources/functionMetadata.php @@ -717,7 +717,10 @@ 'ceil' => ['hasSideEffects' => false], 'checkdate' => ['hasSideEffects' => false], 'checkdnsrr' => ['hasSideEffects' => false], + 'chgrp' => ['hasSideEffects' => true], + 'chmod' => ['hasSideEffects' => true], 'chop' => ['hasSideEffects' => false], + 'chown' => ['hasSideEffects' => true], 'chr' => ['hasSideEffects' => false], 'chunk_split' => ['hasSideEffects' => false], 'class_implements' => ['hasSideEffects' => false], @@ -738,6 +741,7 @@ 'convert_cyr_string' => ['hasSideEffects' => false], 'convert_uudecode' => ['hasSideEffects' => false], 'convert_uuencode' => ['hasSideEffects' => false], + 'copy' => ['hasSideEffects' => true], 'cos' => ['hasSideEffects' => false], 'cosh' => ['hasSideEffects' => false], 'count' => ['hasSideEffects' => false], @@ -823,11 +827,18 @@ 'explode' => ['hasSideEffects' => false], 'expm1' => ['hasSideEffects' => false], 'extension_loaded' => ['hasSideEffects' => false], + 'fclose' => ['hasSideEffects' => true], 'fdiv' => ['hasSideEffects' => false], 'feof' => ['hasSideEffects' => false], + 'fflush' => ['hasSideEffects' => true], + 'fgetc' => ['hasSideEffects' => true], + 'fgetcsv' => ['hasSideEffects' => true], + 'fgets' => ['hasSideEffects' => true], + 'fgetss' => ['hasSideEffects' => true], 'file' => ['hasSideEffects' => false], 'file_exists' => ['hasSideEffects' => false], 'file_get_contents' => ['hasSideEffects' => false], + 'file_put_contents' => ['hasSideEffects' => true], 'fileatime' => ['hasSideEffects' => false], 'filectime' => ['hasSideEffects' => false], 'filegroup' => ['hasSideEffects' => false], @@ -847,16 +858,26 @@ 'finfo::buffer' => ['hasSideEffects' => false], 'finfo::file' => ['hasSideEffects' => false], 'floatval' => ['hasSideEffects' => false], + 'flock' => ['hasSideEffects' => true], 'floor' => ['hasSideEffects' => false], 'fmod' => ['hasSideEffects' => false], 'fnmatch' => ['hasSideEffects' => false], + 'fopen' => ['hasSideEffects' => true], + 'fpassthru' => ['hasSideEffects' => true], + 'fputcsv' => ['hasSideEffects' => true], + 'fputs' => ['hasSideEffects' => true], + 'fread' => ['hasSideEffects' => true], + 'fscanf' => ['hasSideEffects' => true], + 'fseek' => ['hasSideEffects' => true], 'fstat' => ['hasSideEffects' => false], 'ftell' => ['hasSideEffects' => false], 'ftok' => ['hasSideEffects' => false], + 'ftruncate' => ['hasSideEffects' => true], 'func_get_arg' => ['hasSideEffects' => false], 'func_get_args' => ['hasSideEffects' => false], 'func_num_args' => ['hasSideEffects' => false], 'function_exists' => ['hasSideEffects' => false], + 'fwrite' => ['hasSideEffects' => true], 'gc_enabled' => ['hasSideEffects' => false], 'gc_status' => ['hasSideEffects' => false], 'gd_info' => ['hasSideEffects' => false], @@ -1182,8 +1203,11 @@ 'key' => ['hasSideEffects' => false], 'key_exists' => ['hasSideEffects' => false], 'lcfirst' => ['hasSideEffects' => false], + 'lchgrp' => ['hasSideEffects' => true], + 'lchown' => ['hasSideEffects' => true], 'libxml_get_errors' => ['hasSideEffects' => false], 'libxml_get_last_error' => ['hasSideEffects' => false], + 'link' => ['hasSideEffects' => true], 'linkinfo' => ['hasSideEffects' => false], 'locale_accept_from_http' => ['hasSideEffects' => false], 'locale_canonicalize' => ['hasSideEffects' => false], @@ -1270,7 +1294,9 @@ 'mhash_keygen_s2k' => ['hasSideEffects' => false], 'microtime' => ['hasSideEffects' => false], 'min' => ['hasSideEffects' => false], + 'mkdir' => ['hasSideEffects' => true], 'mktime' => ['hasSideEffects' => false], + 'move_uploaded_file' => ['hasSideEffects' => true], 'msgfmt_create' => ['hasSideEffects' => false], 'msgfmt_format' => ['hasSideEffects' => false], 'msgfmt_format_message' => ['hasSideEffects' => false], @@ -1311,6 +1337,7 @@ 'parse_ini_string' => ['hasSideEffects' => false], 'parse_url' => ['hasSideEffects' => false], 'pathinfo' => ['hasSideEffects' => false], + 'pclose' => ['hasSideEffects' => true], 'pcntl_errno' => ['hasSideEffects' => false], 'pcntl_get_last_error' => ['hasSideEffects' => false], 'pcntl_getpriority' => ['hasSideEffects' => false], @@ -1331,6 +1358,7 @@ 'php_uname' => ['hasSideEffects' => false], 'phpversion' => ['hasSideEffects' => false], 'pi' => ['hasSideEffects' => false], + 'popen' => ['hasSideEffects' => true], 'pos' => ['hasSideEffects' => false], 'posix_ctermid' => ['hasSideEffects' => false], 'posix_errno' => ['hasSideEffects' => false], @@ -1375,16 +1403,20 @@ 'range' => ['hasSideEffects' => false], 'rawurldecode' => ['hasSideEffects' => false], 'rawurlencode' => ['hasSideEffects' => false], + 'readfile' => ['hasSideEffects' => true], 'readlink' => ['hasSideEffects' => false], 'realpath' => ['hasSideEffects' => false], 'realpath_cache_get' => ['hasSideEffects' => false], 'realpath_cache_size' => ['hasSideEffects' => false], + 'rename' => ['hasSideEffects' => true], 'resourcebundle_count' => ['hasSideEffects' => false], 'resourcebundle_create' => ['hasSideEffects' => false], 'resourcebundle_get' => ['hasSideEffects' => false], 'resourcebundle_get_error_code' => ['hasSideEffects' => false], 'resourcebundle_get_error_message' => ['hasSideEffects' => false], 'resourcebundle_locales' => ['hasSideEffects' => false], + 'rewind' => ['hasSideEffects' => true], + 'rmdir' => ['hasSideEffects' => true], 'round' => ['hasSideEffects' => false], 'rtrim' => ['hasSideEffects' => false], 'sha1' => ['hasSideEffects' => false], @@ -1445,9 +1477,11 @@ 'substr_compare' => ['hasSideEffects' => false], 'substr_count' => ['hasSideEffects' => false], 'substr_replace' => ['hasSideEffects' => false], + 'symlink' => ['hasSideEffects' => true], 'sys_getloadavg' => ['hasSideEffects' => false], 'tan' => ['hasSideEffects' => false], 'tanh' => ['hasSideEffects' => false], + 'tempnam' => ['hasSideEffects' => true], 'timezone_abbreviations_list' => ['hasSideEffects' => false], 'timezone_identifiers_list' => ['hasSideEffects' => false], 'timezone_location_get' => ['hasSideEffects' => false], @@ -1457,8 +1491,10 @@ 'timezone_open' => ['hasSideEffects' => false], 'timezone_transitions_get' => ['hasSideEffects' => false], 'timezone_version_get' => ['hasSideEffects' => false], + 'tmpfile' => ['hasSideEffects' => true], 'token_get_all' => ['hasSideEffects' => false], 'token_name' => ['hasSideEffects' => false], + 'touch' => ['hasSideEffects' => true], 'transliterator_create' => ['hasSideEffects' => false], 'transliterator_create_from_rules' => ['hasSideEffects' => false], 'transliterator_create_inverse' => ['hasSideEffects' => false], @@ -1469,7 +1505,9 @@ 'trim' => ['hasSideEffects' => false], 'ucfirst' => ['hasSideEffects' => false], 'ucwords' => ['hasSideEffects' => false], + 'umask' => ['hasSideEffects' => true], 'uniqid' => ['hasSideEffects' => false], + 'unlink' => ['hasSideEffects' => true], 'unpack' => ['hasSideEffects' => false], 'urldecode' => ['hasSideEffects' => false], 'urlencode' => ['hasSideEffects' => false], diff --git a/tests/PHPStan/Analyser/NodeScopeResolverTest.php b/tests/PHPStan/Analyser/NodeScopeResolverTest.php index e1c39c2f67..962886fce5 100644 --- a/tests/PHPStan/Analyser/NodeScopeResolverTest.php +++ b/tests/PHPStan/Analyser/NodeScopeResolverTest.php @@ -541,6 +541,8 @@ public function dataFileAsserts(): iterable } yield from $this->gatherAssertTypes(__DIR__ . '/data/bug-2760.php'); + + yield from $this->gatherAssertTypes(__DIR__ . '/data/filesystem-functions.php'); } /** diff --git a/tests/PHPStan/Analyser/data/filesystem-functions.php b/tests/PHPStan/Analyser/data/filesystem-functions.php new file mode 100644 index 0000000000..988fbc8dc3 --- /dev/null +++ b/tests/PHPStan/Analyser/data/filesystem-functions.php @@ -0,0 +1,68 @@ +