Skip to content

Commit

Permalink
Mark file resource functions as having side effects
Browse files Browse the repository at this point in the history
  • Loading branch information
jlherren committed Nov 8, 2021
1 parent 2427b83 commit 8b5f94d
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 0 deletions.
38 changes: 38 additions & 0 deletions bin/functionMetadata_original.php
Expand Up @@ -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],
Expand Down
38 changes: 38 additions & 0 deletions resources/functionMetadata.php
Expand Up @@ -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],
Expand All @@ -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],
Expand Down Expand Up @@ -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],
Expand All @@ -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],
Expand Down Expand Up @@ -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],
Expand Down Expand Up @@ -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],
Expand Down Expand Up @@ -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],
Expand All @@ -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],
Expand Down Expand Up @@ -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],
Expand Down Expand Up @@ -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],
Expand All @@ -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],
Expand All @@ -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],
Expand Down
2 changes: 2 additions & 0 deletions tests/PHPStan/Analyser/NodeScopeResolverTest.php
Expand Up @@ -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');
}

/**
Expand Down
68 changes: 68 additions & 0 deletions tests/PHPStan/Analyser/data/filesystem-functions.php
@@ -0,0 +1,68 @@
<?php

namespace FilesystemFunctions;

use function PHPStan\Testing\assertType;

class Bug5461
{

public function run(): void
{
$fh = fopen('foo.txt', 'r');
if ($fh === false) {
throw new \InvalidArgumentException('Could not open file');
}

while (!feof($fh)) {
$data = (string)fread($fh, 1024);
assertType('bool', feof($fh));
}

fclose($fh);
}

}

class MoreTests
{

public function test1(): void
{
if (fopen('foo.txt', 'r') === false) {
assertType('resource|false', fopen('foo.txt', 'r'));
}
}

/**
* @param resource $fh
*/
public function test2($fh): void
{
if (fread($fh, 4) === 'data') {
assertType('string|false', fread($fh, 4));
}
}

/**
* @param resource $fh
*/
public function test3($fh): void
{
if (ftell($fh) === 0) {
assertType('0', ftell($fh));
fseek($fh, 10);
assertType('int|false', ftell($fh));
}
}

public function test4(string $path): void
{
if (file_get_contents($path) === 'data') {
assertType('\'data\'', file_get_contents($path));
file_put_contents($path, 'other');
assertType('string|false', file_get_contents($path));
}
}

}

0 comments on commit 8b5f94d

Please sign in to comment.