Skip to content

Commit

Permalink
Add filesystem function metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
jlherren committed Oct 5, 2021
1 parent 286b2c7 commit 5350992
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 0 deletions.
47 changes: 47 additions & 0 deletions resources/functionMetadata.php
Expand Up @@ -711,7 +711,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 @@ -732,6 +735,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 @@ -806,6 +810,7 @@
'deg2rad' => ['hasSideEffects' => false],
'dirname' => ['hasSideEffects' => false],
'disk_free_space' => ['hasSideEffects' => false],
'disk_total_space' => ['hasSideEffects' => false],
'diskfreespace' => ['hasSideEffects' => false],
'dngettext' => ['hasSideEffects' => false],
'doubleval' => ['hasSideEffects' => false],
Expand All @@ -816,8 +821,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 @@ -837,13 +852,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 @@ -1172,8 +1200,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 @@ -1260,7 +1291,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 @@ -1296,9 +1329,11 @@
'octdec' => ['hasSideEffects' => false],
'ord' => ['hasSideEffects' => false],
'pack' => ['hasSideEffects' => false],
'parse_ini_file' => ['hasSideEffects' => false],
'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 @@ -1319,6 +1354,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 @@ -1363,15 +1399,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 @@ -1433,9 +1474,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 @@ -1445,8 +1488,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 @@ -1457,7 +1502,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 @@ -514,6 +514,8 @@ public function dataFileAsserts(): iterable
yield from $this->gatherAssertTypes(__DIR__ . '/data/bug-4743.php');
yield from $this->gatherAssertTypes(__DIR__ . '/data/bug-5017.php');
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 5350992

Please sign in to comment.