有没有用于 JavaScript 的静态分析工具?

120

我习惯于在编写代码时,如果出现变量名拼写错误等低级错误,编译器会提示我,但是JavaScript却有一种让这些错误通过的习惯。

是否有适用于JavaScript的静态分析工具?


1
现今的开发中,TypeScript 是你的好朋友——它支持 JavaScript 的隐式类型检查。如果你想要百分之百的类型检查,你可以编写 jsdoc3 或 Google Closure 注释,TypeScript 将从中推断出类型。像 vscode 或者 WebStorm 这样的编辑器也直接支持 TypeScript:https://github.com/Microsoft/TypeScript/wiki/Type-Checking-JavaScript-Files - cancerbero
13个回答

58

2017年更新:是的,使用ESLint。http://eslint.org


除了JSLint(已在Flash Sheridan的答案中提到)和Closure compiler(以前在awhyte的答案中提到),我还从运行JSHintPHP CodeSniffer中获得了很多好处。截至2012年,这四个工具都是免费开源的,并且有着庞大而活跃的开发者社区支持。它们各自执行的检查类型略有不同(我认为它们互补),包括:

JSLint被设计成Douglas Crockford的个人代码检查工具,并且仍然是。它附带了一个很好的默认规则集 - Crockford自己的规则集,随着他对JavaScript及其陷阱的不断学习而不断更新。JSLint非常主观,这通常被认为是一件好事。因此,你只能做有限的配置或禁用单个规则,这意味着将JSLint应用于旧代码可能会很困难(故意)

JSHint与JSLint非常相似(实际上它是JSLint的一个分支),但可以通过命令行选项或.jshintrc文件更容易/可能地配置或禁用JSLint的所有检查。

我特别喜欢可以告诉JSHint报告文件中所有错误,即使有数百个错误。相比之下,虽然JSLint确实有一个maxerr配置选项,但在尝试处理包含大量错误的文件时,它通常会相对较早地退出。

Closure编译器非常有用,如果代码不能通过Closure编译,你可以非常确定该代码在某些基本方面上存在严重问题。Closure编译可能是JS世界中最接近“解释器”语法检查的东西,例如php -lruby -c

Closure还会警告您潜在的问题,例如缺少参数和未声明或重新定义的变量。如果您没有看到预期的警告,请尝试通过使用--warning_level VERBOSE选项调用Closure来增加警告级别。

PHP CodeSniffer可以解析JavaScript,以及PHP和CSS。CodeSniffer附带了几种不同的编码标准(使用phpcs -i查看),其中包括许多有用的sniffs,用于检查JavaScript代码,包括内联控制结构多余的空格

这里是PHP CodeSniffer版本1.3.6可用的JavaScript代码嗅探列表,以及一个自定义规则集合,可以一次性运行它们。使用自定义规则集合,很容易挑选和选择您想要应用的规则。如果您想要执行不受支持的特定“内部风格”,甚至可以编写自己的代码嗅探。据我所知,CodeSniffer是这四个工具中唯一支持自定义和创建新静态分析规则的工具。不过有一点需要注意:CodeSniffer是提到的所有工具中速度最慢的。


2
现在,通过CPD,JavaScript代码的复制粘贴检测功能已经可用。据我所知,这是JavaScript的第一个强大的开源代码重复工具!请访问http://pmd.sourceforge.net,并查看“是否有类似于JavaScript的CPD工具?”的问题:http://stackoverflow.com/a/13745190/55478 - Noah Sussman

51

我认为JSLint是最好的开始。 请注意,JavaScript LintJSLint不同。 我还建议查看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的代码应该在今年夏天某个时候可用。


2
@UpTheCreek:JSLint 可在 GitHub 上获取。 - Dave Swersky
@Dave 哦,没错,太好了 :) - UpTheCreek
5
TAJS的源代码现在可供使用。 - Rich Dougherty

20

Google的“Closure”JS编译器可以在编译时产生可配置的警告和错误。它绝对能够发现拼写错误的变量和方法,还有参数数量错误。如果你愿意按照Closure的方式编写JsDoc,它也可以利用类型信息进行更多操作。

YUI "Compressor"工具也可以产生警告,但我还没有尝试过。

我在使用建立在Eclipse基础上的Aptana IDE时并没有取得太大成功,但其他人喜欢它。请参见Stack Overflow讨论JS IDEs。

IntelliJ IDE是一款收费软件,但其JS支持非常出色。它会在你输入时检测和突出显示拼写错误的变量和方法等等。此外,它还有自动完成功能。


11

总之,可用的工具包括JSLint、JSHint、Plato、ESLint和Google Closure-Linter。在尝试安装Google Closure-Linter for Windows时,我遇到了安装问题。但是,网页上确实提到它对Windows的支持是实验性的。

我找到并尝试了另一个工具,效果很好。这是它的链接:http://esprima.org/

此外,这是Esprima工具的github链接:https://github.com/ariya/esprima


7
您可以在此维基页面中找到一些用于JavaScript静态代码分析的工具。
但是,维基页面上没有提到的一个工具是DeepScan。它的重点是查找运行时错误和质量问题,而不是linter规范的编码约定。它还覆盖TypeScript、React和Vue.js。
您可以为GitHub项目试用它。

6

4
在商业领域中,从版本7.7(2015年中期)开始,Coverity静态分析支持JavaScript的分析。关于您特定的错别字查询,我的宠物项目出现在最新版本(2016年初)中,可以找到程序元素名称的拼写错误。 作为该项目的主要开发者,请接受我的厚颜无耻之举:虽然Coverity的JavaScript分析还没有像备受推崇的C/C++分析一样成熟,但它共享了许多相同的引擎,并专注于查找具有低误报率的高价值缺陷。我们正在加强对JavaScript(和其他语言)中安全缺陷的发现,除了发现一般性的编程错误。
现在,这里是一些它发现的拼写错误(确切的错别字留给读者作为练习,以强调这些错误容易被忽视):

merge.js:(稳定链接) (最新修订版)

commands-packages-query.js:(稳定链接) (最新修订版)

series-pie-tests.js: (稳定链接) (最新版本)

outline_case.js: (稳定链接) (最新版本)


4
比起通用目的列表,更注重安全性的列表可以在Mozilla Wiki上找到:Security/B2G/JavaScript code analysis

本文档的目的是收集适合包含在即将推出的Mozilla项目中或供内部使用的JavaScript代码分析工具。

此外,至少有一个商业产品可以进行安全分析:Burp gets new JavaScript analysis capabilities

Burp的最新版本包括一个新的静态分析JavaScript代码引擎。这使得Burp Scanner能够报告一系列新的漏洞,包括:

  • 基于DOM的XSS攻击
  • JavaScript注入
  • 客户端SQL注入
  • WebSocket劫持
  • 本地文件路径操纵
  • 基于DOM的开放重定向
  • Cookie操纵
  • Ajax请求头操纵
  • 基于DOM的拒绝服务攻击
  • Web消息操纵
  • HTML5存储操纵

3

Flow 可以进行静态分析,无需注释也可以实现。

如果需要注释,则其语法与 TypeScript 兼容。

安装 package 的方式如下:

npm install --global flow-bin

还有一些工具可供使用。请查看gulp-flowtypeSublimeLinter-flow


3

对于这种事情,我喜欢使用Jslint...


很棒。我在http://www.rockstarapps.com/joomla-1.5.8/products/jslint-eclipse-plugin.html找到了一个Eclipse插件,看起来也不错。请注意,需要从“jsLex 1.2.2 Beta版本的Eclipse更新站点”安装才能获得JSLint功能。 - Mat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接