Add Safe PHP functions

This commit is contained in:
Alex Cabal 2019-03-07 12:11:50 -06:00
parent 04a956886a
commit 58cc098058
260 changed files with 49458 additions and 45 deletions

View file

@ -0,0 +1,42 @@
<?php
namespace TheCodingMachine\Safe\PHPStan\Rules;
use PHPStan\Rules\FunctionCallParametersCheck;
use PHPStan\Rules\Methods\CallMethodsRule;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleLevelHelper;
use PHPStan\Testing\RuleTestCase;
use TheCodingMachine\Safe\PHPStan\Type\Php\ReplaceSafeFunctionsDynamicReturnTypeExtension;
class CallMethodRuleTest extends RuleTestCase
{
protected function getRule(): Rule
{
$broker = $this->createBroker();
$ruleLevelHelper = new RuleLevelHelper($broker, true, true, true);
return new CallMethodsRule(
$broker,
new FunctionCallParametersCheck($ruleLevelHelper, true, true),
$ruleLevelHelper,
true,
true
);
}
public function testSafePregReplace()
{
// FIXME: this rule actually runs code but will always return no error because the rule executed is not the correct one.
// This provides code coverage but assert is not ok.
$this->analyse([__DIR__ . '/data/safe_pregreplace.php'], []);
}
/**
* @return \PHPStan\Type\DynamicFunctionReturnTypeExtension[]
*/
public function getDynamicFunctionReturnTypeExtensions(): array
{
return [new ReplaceSafeFunctionsDynamicReturnTypeExtension()];
}
}

View file

@ -0,0 +1,34 @@
<?php
namespace TheCodingMachine\Safe\PHPStan\Rules;
use PHPStan\Testing\RuleTestCase;
use TheCodingMachine\Safe\PHPStan\Type\Php\ReplaceSafeFunctionsDynamicReturnTypeExtension;
class UseSafeFunctionsRuleTest extends RuleTestCase
{
protected function getRule(): \PHPStan\Rules\Rule
{
return new UseSafeFunctionsRule();
}
public function testCatch()
{
$this->analyse([__DIR__ . '/data/fopen.php'], [
[
"Function fopen is unsafe to use. It can return FALSE instead of throwing an exception. Please add 'use function Safe\\fopen;' at the beginning of the file to use the variant provided by the 'thecodingmachine/safe' library.",
4,
],
]);
}
public function testNoCatchSafe()
{
$this->analyse([__DIR__ . '/data/safe_fopen.php'], []);
}
public function testExprCall()
{
$this->analyse([__DIR__ . '/data/undirect_call.php'], []);
}
}

View file

@ -0,0 +1,5 @@
<?php
function foo() {
$fp = fopen('foobar', 'r');
}

View file

@ -0,0 +1,6 @@
<?php
use function Safe\fopen;
function foo() {
$fp = fopen('foobar', 'r');
}

View file

@ -0,0 +1,7 @@
<?php
use function Safe\preg_replace;
$x = preg_replace('/foo/', 'bar', 'baz');
$y = stripos($x, 'foo');
$x = preg_replace(['/foo/'], ['bar'], ['baz']);

View file

@ -0,0 +1,5 @@
<?php
function foo() {
$toto = 'fopen';
$toto('foobar', 'r');
}