PHP 7静态分析工具
PHP 7静态分析工具

PHP 7静态分析工具

使用PHP 7正式生活,它是时候审核代码并准备好迁移。现在是时候考虑将代码迁移到新版本的时间,利用新功能ET减少服务器负载。这意味着回顾所有代码:可能会手动完成太多。

这是静态分析是一个重要的帮助。它是一种读取代码而不执行它的软件,并搜索导致问题的模式。而且您可以高兴:我们发现不少于三个开源PHP 7静态分析工具。

PHP 7介绍了几种有利于静态分析的功能。主要是内部AST:抽象句法树。这是令牌和执行之间的PHP代码的有组织表示。此时,PHP令牌完全组织为树,只需要索引并遍历以找到错误模式。

PHP有三个开源静态分析仪:Phan,Exakat和Tuli。让它们安装它们,并在1000 PHP脚本的中间大小项目上运行它们。

凤凰

凤凰 是Rasmus Lerdorf的实验性PHP静态分析仪。它于2015年7月开始,开始收集捐款,并巨大地增长。它依赖于PHP 7’s AST延期,解码PHP代码。然后,使用两个通过,Phan扫描代码,构建几个功能,并发现应该审查的有趣的作品。

安装

凤凰 需要PHP 7和 Ext / Ast来自Nikita。 EXT / AST不包含在标准分布中,也不包含在PECL中,可在GitHub上获得。 Phan还使用作曲家进行额外的组件。

git clone //github.com/etsy/phan.git
cd phan
composer install

跑步

凤凰 适用于独立文件或提供的文件。它适用于PHP 5和7代码。 Phan支持phpdoc评论,所以何时‘@return string’可用于PHP 5中的Typehint Return,Phan报告潜在的违规行为。它斑点未定义的类,错误的参数或统一语法变量。

php phan file.php
php phan -f filelist.txt

// Other help
php phan -h

结果

凤凰 结果是文本,文件,行和错误,一行都是一行。 Phan报告了3080个问题:未定义的课程,错误的参数的时间等。它报道了很多未定义的课程。

Tasks/CleanDb.php:124 UndefError call to method on undeclared class Exception
Tasks/Doctor.php:54 VarError Variable $stats is not defined
Tasks/Initproject.php:45 UndefError call to undeclared method \Tasks\initproject->scheck_project_dir()
Tasks/Jobqueue.php:72 TypeError arg#2(mode) is bool but \stream_set_blocking() takes int
Tasks/Jobqueue.php:77 TypeError arg#2(mode) is bool but \stream_set_blocking() takes int
Tasks/Jobqueue.php:105 TypeError arg#2(mode) is bool but \stream_set_blocking() takes int
Tasks/Load.php:151 VarError Variable $x is not defined
Tasks/Load.php:270 VarError Variable $T is not defined

PHAN快速运行,因为分析了1000个文件在4秒内完成。它处理了16种分析,可用 SRC / Phan / Analyze 源的文件夹。

最后

凤是早期的。 GitHub项目是提供反馈或贡献的良好开端。文档是稀缺的:单元测试文件夹是找到信息的很好资源。

exakat.

exakat. 发动机是强制执行的 lexphp. ’s 编码参考。它旨在审核PHP代码并提供具有索引,文件和代码行的完整报告。 Exakat于2014年开始。它基于自制AST,与5和7的PHP版本兼容。它以两个阶段运行:第一次加载数据库中的令牌,构建AST和有趣的哈希。第二个运行实际分析。

安装

代码本身可用 GitHub. ,或作为exakat.io的小便。 exakat需要A. Neo4j graph database, with Gremlin插件。 exakat在标准PHP 5或7上运行。

  • 从中下载Phar http://178.62.231.40/download-exakat/
  • Install neo4j and gremlin from the manual : //github.com/exakat/exakat/blob/master/docs/manual.md
  • 检查安装:PHP exakat.phar医生

跑步

exakat扫描整个项目:它只需要根文件夹并查找其中的所有PHP脚本。

php exakat.phar init -p myproject -R //github.com/exakat/exakat/
php exakat.phar project -p myproject

exakat在先前使用的1000个文件上运行大约22分钟。在代码上共使用502分析。虽然第一个结果是在5分钟后获得的,但随着发动机仍在运行,完成。

最终报告可作为文本,XML或 HTML. .

结果

exakat. 报道了4956个问题,64分析报告了一些发现。分析分析在几个食谱中:安全性,兼容性PHP 7,性能,死亡代码,新功能等。

scripts/merge_sqlite.php:46 Double Assignation
scripts/merge_sqlite.php:46 Static Methods Called From Object
scripts/merge_sqlite.php:40 Echo With Concat
scripts/merge_sqlite.php:33 Echo With Concat
scripts/merge_sqlite.php:24 Uses default values
scripts/merge_sqlite.php:24 No Hardcoded Path
scripts/merge_sqlite.php:30 Static Methods Called From Object
scripts/merge_sqlite.php:32 Queries in loops
scripts/merge_sqlite.php:48 Static Methods Called From Object
scripts/merge_sqlite.php:51 Static Methods Called From Object
scripts/merge_sqlite.php:57 Queries in loops
scripts/merge_sqlite.php:61 Static Methods Called From Object

最后

exakat每周更新,并继续增加大规模项目的更多分析和速度。文档是滞后的,并在GitHub项目中欢迎反馈。

郁金香

郁金香 是Anthony Ferrera的大脑孩子。它是一种原型,它提供了一个坚实的平台来开始写入静态分析。它开始于2015年底。

安装

克隆 郁金香 它来自github(和作曲家),或直接使用 作曲家 。 AST使用Nikita Popov构建’s PHP-PARSER. 。这一个是PHP 5的,并且由PHP 7中的EXT / AST取代。否则没有特殊依赖性。

git clone //github.com/ircmaxell/Tuli
cd tuli
composer install

跑步

郁金香 非常快,为1000个文件服用33秒,但必须从原始列表中删除几个文件以运行到结束(并且必须提升Xdebug的递归限制)。

郁金香 Ran 3分析,详细 在代码中。 此文件夹也是写新规则的文件夹。

分析仪报告了266个问题。

Type mismatch on str_replace() argument 2, found unknown expecting string|array Analyzer/Docs.php:172
Type mismatch on str_replace() argument 2, found unknown expecting string|array Analyzer/Functions/IsExtFunction.php:36
Type mismatch on str_replace() argument 2, found unknown expecting string|array Analyzer/Interfaces/IsExtInterface.php:35
Type mismatch on strtolower() argument 0, found unknown expecting string Analyzer/Analyzer.php:1989
Type mismatch on strtolower() argument 0, found unknown expecting string Analyzer/Analyzer.php:2002
Type mismatch on strtolower() argument 0, found null|bool|int|float|string|object|callable expecting string Analyzer/Analyzer.php:2006
Type mismatch on strtolower() argument 0, found unknown expecting string Analyzer/Classes/toStringPss.php:35
Type mismatch on substr() argument 0, found null|bool|int|float|string|object|array|callable expecting string Analyzer/Analyzer.php:127

最后

郁金香 绝对是一个工作原型。它提供了一些有趣的反馈,并开放了贡献。它使用了PHP的上下文免费语法,这也是安东尼的侧面项目(//github.com/ircmaxell/php-cfg )。

结论

PHP 7是用于更静态分析的铺设地,尤其是返回和标量型提示。虽然,所有三个3 PHP 7静态分析愉快地在PHP 5代码上工作。实际上,他们都提供了反馈,为PHP 7做准备代码。这是一个充分的理由,即今天开始使用它们,并尽快移动到PHP 7。

要是我们’错过了另一个静态分析仪,请告诉我们它,我们’ll添加它。我们还知道有一些商业分析仪,我们可能会稍后审查。