我习惯于在编写代码时,如果出现变量名拼写错误等低级错误,编译器会提示我,但是JavaScript却有一种让这些错误通过的习惯。
是否有适用于JavaScript的静态分析工具?
我习惯于在编写代码时,如果出现变量名拼写错误等低级错误,编译器会提示我,但是JavaScript却有一种让这些错误通过的习惯。
是否有适用于JavaScript的静态分析工具?
2017年更新:是的,使用ESLint。http://eslint.org
除了JSLint(已在Flash Sheridan的答案中提到)和Closure compiler(以前在awhyte的答案中提到),我还从运行JSHint和PHP CodeSniffer中获得了很多好处。截至2012年,这四个工具都是免费开源的,并且有着庞大而活跃的开发者社区支持。它们各自执行的检查类型略有不同(我认为它们互补),包括:
JSLint被设计成Douglas Crockford的个人代码检查工具,并且仍然是。它附带了一个很好的默认规则集 - Crockford自己的规则集,随着他对JavaScript及其陷阱的不断学习而不断更新。JSLint非常主观,这通常被认为是一件好事。因此,你只能做有限的配置或禁用单个规则,这意味着将JSLint应用于旧代码可能会很困难(故意)。
JSHint与JSLint非常相似(实际上它是JSLint的一个分支),但可以通过命令行选项或.jshintrc
文件更容易/可能地配置或禁用JSLint的所有检查。
我特别喜欢可以告诉JSHint报告文件中所有错误,即使有数百个错误。相比之下,虽然JSLint确实有一个maxerr
配置选项,但在尝试处理包含大量错误的文件时,它通常会相对较早地退出。
Closure编译器非常有用,如果代码不能通过Closure编译,你可以非常确定该代码在某些基本方面上存在严重问题。Closure编译可能是JS世界中最接近“解释器”语法检查的东西,例如php -l
或ruby -c
Closure还会警告您潜在的问题,例如缺少参数和未声明或重新定义的变量。如果您没有看到预期的警告,请尝试通过使用--warning_level VERBOSE
选项调用Closure来增加警告级别。
phpcs -i
查看),其中包括许多有用的sniffs,用于检查JavaScript代码,包括内联控制结构和多余的空格。
这里是PHP CodeSniffer版本1.3.6可用的JavaScript代码嗅探列表,以及一个自定义规则集合,可以一次性运行它们。使用自定义规则集合,很容易挑选和选择您想要应用的规则。如果您想要执行不受支持的特定“内部风格”,甚至可以编写自己的代码嗅探。据我所知,CodeSniffer是这四个工具中唯一支持自定义和创建新静态分析规则的工具。不过有一点需要注意:CodeSniffer是提到的所有工具中速度最慢的。
我认为JSLint是最好的开始。 请注意,JavaScript Lint与JSLint不同。 我还建议查看JSure,在我的有限测试中,它比它们表现得更好,尽管实现上存在一些问题 - Intel Mac版本在启动时崩溃了,但PowerPC版本在Intel上运行良好,Linux版本也运行良好。(开发人员Berke Durak说他会在修复后回复我,但我没有收到他的消息。)
不要期望从JavaScript静态分析中获得与良好C检查器相同的结果。正如Durak告诉我的那样,“由于Javascript的动态性质,任何非平凡分析都非常困难。”
(另一个更加晦涩的仅限于Mac的错误,这次是JSLint的Konfabulator小部件:将BBEdit文档图标拖动到小部件上会将该文档移至垃圾箱。 Douglas Crockford开发人员并未在Mac上尝试过该小部件。)
2009年8月10日:今天在静态分析研讨会上,Simon Holm Jensen发表了一篇有关TAJS:JavaScript类型分析器的论文,与Anders Møller和Peter Thiemann合作撰写。该论文没有提到上述工具,但是Jensen告诉我他看过其中一些,并不印象深刻。 TAJS的代码应该在今年夏天某个时候可用。
Google的“Closure”JS编译器可以在编译时产生可配置的警告和错误。它绝对能够发现拼写错误的变量和方法,还有参数数量错误。如果你愿意按照Closure的方式编写JsDoc,它也可以利用类型信息进行更多操作。
YUI "Compressor"工具也可以产生警告,但我还没有尝试过。
我在使用建立在Eclipse基础上的Aptana IDE时并没有取得太大成功,但其他人喜欢它。请参见Stack Overflow讨论JS IDEs。
IntelliJ IDE是一款收费软件,但其JS支持非常出色。它会在你输入时检测和突出显示拼写错误的变量和方法等等。此外,它还有自动完成功能。
总之,可用的工具包括JSLint、JSHint、Plato、ESLint和Google Closure-Linter。在尝试安装Google Closure-Linter for Windows时,我遇到了安装问题。但是,网页上确实提到它对Windows的支持是实验性的。
我找到并尝试了另一个工具,效果很好。这是它的链接:http://esprima.org/
此外,这是Esprima工具的github链接:https://github.com/ariya/esprima
commands-packages-query.js:(稳定链接) (最新修订版)
此外,至少有一个商业产品可以进行安全分析:Burp gets new JavaScript analysis capabilities本文档的目的是收集适合包含在即将推出的Mozilla项目中或供内部使用的JavaScript代码分析工具。
Burp的最新版本包括一个新的静态分析JavaScript代码引擎。这使得Burp Scanner能够报告一系列新的漏洞,包括:
- 基于DOM的XSS攻击
- JavaScript注入
- 客户端SQL注入
- WebSocket劫持
- 本地文件路径操纵
- 基于DOM的开放重定向
- Cookie操纵
- Ajax请求头操纵
- 基于DOM的拒绝服务攻击
- Web消息操纵
- HTML5存储操纵
Flow 可以进行静态分析,无需注释也可以实现。
如果需要注释,则其语法与 TypeScript 兼容。
安装 package 的方式如下:
npm install --global flow-bin
还有一些工具可供使用。请查看gulp-flowtype和SublimeLinter-flow
对于这种事情,我喜欢使用Jslint...