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 Oct 4, 2021
1 parent 286b2c7 commit 86d0fd8
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 0 deletions.
19 changes: 19 additions & 0 deletions resources/functionMetadata.php
Expand Up @@ -816,7 +816,14 @@
'explode' => ['hasSideEffects' => false],
'expm1' => ['hasSideEffects' => false],
'extension_loaded' => ['hasSideEffects' => false],
'fclose' => ['hasSideEffects' => true],
'fdiv' => ['hasSideEffects' => false],
'feof' => ['hasSideEffects' => true],
'fflush' => ['hasSideEffects' => true],
'fgetc' => ['hasSideEffects' => true],
'fgetcsv' => ['hasSideEffects' => true],
'fgets' => ['hasSideEffects' => true],
'fgetss' => ['hasSideEffects' => true],
'file_exists' => ['hasSideEffects' => false],
'fileatime' => ['hasSideEffects' => false],
'filectime' => ['hasSideEffects' => false],
Expand All @@ -837,13 +844,25 @@
'finfo::buffer' => ['hasSideEffects' => false],
'finfo::file' => ['hasSideEffects' => false],
'floatval' => ['hasSideEffects' => false],
'flock' => ['hasSideEffects' => true],
'floor' => ['hasSideEffects' => false],
'fmod' => ['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' => true],
'ftell' => ['hasSideEffects' => true],
'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
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/file-resource-functions.php');
}

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

namespace FileResourceFunctions;

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
{

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

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

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

}

0 comments on commit 86d0fd8

Please sign in to comment.