如何在php中执行静态代码分析?[关闭]


465

是否有用于PHP源文件的静态分析工具?二进制本身可以检查语法错误,但是我正在寻找功能更多的东西,例如:

  • 未使用的变量分配
  • 未先初始化就分配给的数组
  • 以及可能的代码样式警告
  • ...

57
Righty-o:被SO封闭,显然,这种答案非常有用。
艾拉·巴克斯特

3
同意。这个问题至关重要。php lint(php -l文件)无法提供另一半:运行自动加载,确保存在一个称为的函数,该变量存在,对象属性存在。等
2014年

6
@IraBaxter在主题上很有用,但严格来讲不是。softwarerecs.stackexchange.com可能是更热门的位置。当然,具有讽刺意味的是,更多的开发人员对SO的熟悉程度超过了它的兄弟水平……
Wayne Werner

7
许多人认为这类问题有用的事实可能是为什么现在存在softwarerecs的原因。当这是唯一的堆栈交换站点时,肯定可以回过头来。现在有一个明确的地方,迁移有意义吗?
eswald 2015年

4
由于触发快乐的关闭器而关闭。呸!
Roadowl '16

Answers:


356

从命令行以lint-mode运行php来验证语法而不执行:

php -l FILENAME

更高级别的静态分析器包括:

低层分析器包括:

运行时分析器由于PHP的动态特性而在某些方面更有用,包括:

文档库phpdocdoxygen执行一种代码分析。例如,可以将Doxygen配置为使用graphviz呈现漂亮的继承图。

另一个选择是xhprof,它类似于xdebug,但更轻巧,使其适合生产服务器。该工具包括基于PHP的界面。


20
花费6个小时来尝试所有这些好东西,从而获得+1!
安倍·佩特里罗

14
@dimitko:这是因为php -l一次只能读取一个输入文件(也就是说,如果您这样做,将无法正常工作php -l file1.php file2.php)。相反,您需要使用该-n 1选项,该选项告诉xargs每个命令进程仅使用一个输入行。相反,它将导致它分别运行,php -l file1.php后跟php -l file2.php。同时,您可以一次-P <n>运行“ n”个进程,以并行执行:find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
Joe

11
find /your/path -name '*.php' -exec php -l {} \;工作可靠。
科恩

11
注意:要使内置的lint函数(php -l)起作用,您必须设置display_errors = onin php.ini,否则您将仅收到有关存在语法错误的通用消息,而没有有关哪些错误或哪些行的详细信息。
Synetech

8
Synetech-好人。但是,您可以使用-d开关在命令行上覆盖设置。例如php -l -d display_errors=on $FILENAME
troelskn



24

PHP Mess Detector非常棒且快速。


7
谢谢!我一直在寻找很棒的东西。实际上,除了出色的工具,我拒绝使用任何其他工具。:)
Falken教授的合同

1
这是一个开始,这似乎是Netbeans所使用的,但是我不完全相信它。它的某些选项很奇怪(如果使用else语句会“警告”您??),并且在检测到许多大错误时,甚至还没有得到开发人员的响应:github.com/phpmd / phpmd / issues
NoBugs

否则会增加循环复杂性,并且通常可以用不同的方式写以避免或其他。例如,如果(true){$ x = 1; } else {$ x = 2; 可以重写:$ x = 2; 如果(true){$ x = 1; }
RichardAtHome

17

我尝试使用$ php -l和其他一些工具。但是,根据我的经验,最好的方法(当然是YMMV)是对pfff工具集的检查。我听说过Quora上的pfff(http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool

您可以编译并安装它。没有好的软件包(在我的薄荷Debian上,我必须先安装libpcre3-dev,ocaml,libcairo-dev,libgtk-3-dev和libgimp2.0-dev依赖项),但它应该是一个完整的软件包。

结果报告像

rjha@mint ~ $ ~/sw/pfff/scheck ~/code/github/sc/
login-now.php:7:4: CHECK: Unused Local variable $title
go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl.

谢谢。它一直抱怨我们的动态导入,但是到目前为止,它的其他功能看起来还不错。我还需要安装binutils-gold,而scheck需要安装在自定义路径中,但现在看来可以正常工作。
eswald 2012年

1
@eswald现在我是一个PHP混乱检测器(phpmd)转换。在到目前为止我尝试过的所有工具中(PHP代码嗅探器,scheck,php -l,phpmd),恕我直言,phpmd最适合我的情况。
rjha94 2012年

您知道在哪里可以找到Scheck吗?
乔治·卡萨诺斯

1
@GeorgeKatsanos scheck是pfff工具集的一部分。github.com/facebook/pfff
rjha94

2
Scheck总是给我错误“ PHP检查程序需要一个图形文件”。几乎不存在的文档没有示例。
罗伯特·布鲁斯

14

请参阅Semantic Designs的CloneDR,这是一个“克隆检测”工具,用于查找复制/粘贴/编辑的代码。尽管有空格,注释,甚至变量重命名,它仍会找到准确的和几乎未命中的代码片段。您可以在wesite上找到PHP的示例检测报告。(我是作者)。


1
观察该站点,这似乎是一个不可思议的工具。我待会再仔细看!感谢您的链接(“ +1是我也是作者”)
Eric Cope

任何令人信服的本科生的祸根。
wom 2012年

7

NetBeans IDE检查语法错误,未使用的变量等。它不是自动的,但是对于中小型项目来说效果很好。


6

有一个名为nWire的PHP新工具。它是Eclipse PDT和Zend Studio 7.x的代码探索插件。它支持PHP的实时代码分析,并提供以下工具:

  • 代码可视化-组件和关联的交互式图形表示。
  • 代码导航-独特的导航视图显示所有关联,并在您编写或阅读代码时与您一起工作。
  • 快速搜索-键入时搜索方法,字段,文件等。

1
它不是问题的答案。像答案存在netbeans等
。– Yosef

5

PHP PMD(项目混乱检测器)和PHP CPD(复制粘贴检测器)作为PHPUnit的前一部分


4

RIPS-静态源代码分析器,用于PHP脚本中的漏洞。RIPS的来源可从SourceForge获得

从RIPS站点:

RIPS是用PHP编写的工具,可使用静态代码分析来查找PHP应用程序中的漏洞。通过标记和解析所有源代码文件,RIPS能够将PHP源代码转换为程序模型,并检测程序流期间用户输入(受恶意用户影响)可能污染的敏感接收器(潜在易受攻击的函数)。除了发现漏洞的结构化输出外,RIPS还提供了集成的代码审核框架,用于进一步的手动分析。


RIPS是一个半死角项目,它仅适用于非OOP php代码。
alexglue 2014年

3

绝对有一种用于静态代码分析的新工具,称为PHP分析器

在许多类型的静态分析中,它还提供基本的自动修复功能,请参阅文档

更新:PHP-Analyzer现在是不推荐使用的项目,但是您仍然可以在旧版分支上访问它


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.