是否有JavaScript静态分析工具?[关闭]


110

当我在变量名上做错字(例如错字)时,我习惯于让编译器抱怨,但是JavaScript习惯于让它通过。

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


1
现在,天打字稿是您的朋友-它支持javascript隐式类型检查,如果您想100%编写,可以编写jsdoc3或google封闭注释,它将从那里推断类型。像vscode或webstorm这样的编辑器都提供了开箱即用的支持:github.com/Microsoft/TypeScript/wiki/…–
Cancerbero

Answers:


49

我同意JSLint是最好的起点。请注意,JavaScript LintJSLint不同。我还建议您检查一下JSure,尽管在实现方面有些粗糙,但在有限的测试中它比其中任何一个都要好-英特尔Mac版本在启动时崩溃了,尽管PowerPC版本即使在英特尔上也运行良好, Linux版本也运行良好。(开发商Berke Durak表示,在解决此问题后,他会尽快与我联系,但我没有收到他的来信。)

对JavaScript静态分析的期望与对C语言检查器的期望不一样。正如Durak告诉我的那样,“由于Javascript的动态特性,任何不平凡的分析都是非常困难的。”

(这是另一个更加模糊的纯Mac漏洞,这次是JSLint的Konfabulator小部件:将BBEdit文档图标拖到小部件上会将文档移到垃圾箱。开发人员Douglas Crockford尚未在Mac上尝试过该小部件。)

2009年8月10日:今天在静态分析研讨会上,Simon Holm Jensen与AndersMøller和Peter Thiemann撰写了一篇关于TAJS:JavaScript的类型分析器的论文。该论文没有提到上述工具,但詹森告诉我,他研究了其中一些工具,并没有留下深刻的印象。TAJS的代码应该在今年夏天的某个时候可用。


2
@UpTheCreek:JSLint在GitHub上可用。
Dave Swersky 2012年

@Dave哦,对,太好了:)
UpTheCreek 2012年

5
TAJS的源代码现在可用。
Rich Dougherty 2012年

57

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


除了JSLint的(已经提到的Flash Sheridan的答案)和Closure编译器(前面提到awhyte的答案)我曾经也得到了很多好处运行JSHintPHP CodeSniffer。截至2012年,所有这四个工具都是免费的开放源代码,并拥有庞大而活跃的开发人员社区。它们执行的检查类型各有不同(我认为是互补的):

JSLint旨在成为并且仍然是Douglas Crockford的个人整理工具。它附带了一个很棒的默认规则集-Crockford自己的规则集,随着他继续学习 JavaScript及其陷阱,它会不断更新。JSLint的意见很高,通常被视为一件好事。因此,您可以(有意地)限制或配置单个规则。但这会使将JSLint应用于遗留代码变得困难。

JSHint非常相似的JSLint(事实上,它开始生活作为JSLint的叉),但它更容易/可配置或禁用通过命令行选项或通过JSLint的支票的所有.jshintrc文件

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

Closure编译器非常有用,因为如果代码无法使用Closure进行编译,则可以肯定地说,这些代码已经以某种基本方式深入开发。闭包编译可能是JS世界中最接近“解释器”语法检查的东西,例如php -lruby -c

闭包还会警告您潜在的问题,例如缺少参数以及未声明或重新定义的变量。如果您没有看到预期的警告,请尝试通过调用带有以下选项的“关闭”来提高警告级别:--warning_level VERBOSE

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

这是PHP CodeSniffer 1.3.6版以来可用的JavaScript嗅探列表,这是一个自定义规则集,可让您一次运行它们。 使用自定义规则集,可以轻松选择要应用的规则。而且,如果您想强制使用一种特定的“家庭风格”,而该特性不被开箱即用,甚至可以编写自己的嗅探。Afaik CodeSniffer是这里提到的四个工具中唯一支持自定义和创建新静态分析规则的工具。需要注意的是:CodeSniffer还是所有提到的工具中运行最慢的。


2
现在可以通过CPD使用JavaScript代码进行复制粘贴检测。据我所知,这是第一个强大的JavaScript开放源代码复制工具!pmd.sourceforge.net,另请参见“是否有CPD之类的JavaScript工具?” stackoverflow.com/a/13745190/55478
Noah Sussman

20

Google的“ Closure” JS编译器在编译时会生成可配置的警告和错误。它肯定会找到拼写错误的变量和方法,以及arity错误。如果您愿意用Closure方式编写JsDoc,那么它也可以处理类型信息。

YUI“压缩器”工具也可以产生警告,但是还没有尝试过。

我对基于Eclipse构建的Aptana IDE不太满意,但是其他人喜欢它。请参阅JS IDE的堆栈溢出讨论。

上次我检查的不是免费的IntelliJ IDE具有frickin的出色JS支持。键入时,它将检测并突出显示拼写错误的var和方法等。它也具有自动完成功能。


11

总之,可以使用JSLint,JSHint,Plato,ESLint,Google Closure-Linter。我在尝试Windows版Google Closure-Linter时遇到安装问题。但是,它确实在网页上提到它对Windows的支持是试验性的。我找到并尝试了另一种效果很好的工具。这是它的链接:http : //esprima.org/

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


7

您可以在此Wiki中看到一些用于JavaScript静态代码分析的工具。

Wiki中的一个工具,但本文中未提及的是DeepScan。它的重点是查找运行时错误和质量问题,而不是棉短绒的编码约定。它还涵盖TypeScript,React和Vue.js。

您可以在GitHub项目中试用。



4

可以在Mozilla Wiki上的Security / B2G / JavaScript代码分析中找到比一般用途列表更注重安全性的内容

本文档旨在收集适用于即将到来的Mozilla项目或内部使用的JavaScript代码分析工具。

另外,至少有一种商业产品可以进行安全性分析: Burp获得了新的JavaScript分析功能

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

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

4

在商业领域,Coverity Static Analysis支持从7.7版(2015年中)开始对JavaScript进行分析。关于您对错别字的具体查询,我的宠物项目出现在最新版本(2016年初,8.0)中,确实在程序元素的名称中发现了错别字

作为该项目的主要开发人员,请接受我无耻的插件:尽管尚未达到尊敬的C / C ++分析的成熟水平,Coverity的JavaScript分析却拥有许多相同的引擎,并且着重于发现具有低价值的高价值缺陷。假阳性缺陷报告率。除了查找一般的编程错误之外,我们还将更多的精力放在查找JavaScript(和其他语言)的安全缺陷上。

现在,这里是它发现的一些错别字(为练习者保留了确切的错字,以强调读者可以轻易忽略这些错字):

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

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

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

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




2

JSAnalyse刚刚在Codeplex上发布。它是分析javascript文件之间的依赖关系的工具。您甚至可以定义允许的依赖关系,然后JSAnalysis检查所定义的规则是否得到满足。这样即使在大型项目中也可以跟踪javascript依赖项,并拥有干净的体系结构。

JSAnalyse可以作为命令行工具执行,也可以通过Visual Studio Layer Diagramm进行配置。集成到构建中也很容易。使用封闭式签入,您可以控制依赖项。

http://jsanalyse.codeplex.com/


1

我们的SD ECMAScript CloneDR是一个工具,可在大型JavaScript源代码库中查找重复代码的准确和几乎未命中的副本。

它使用语言语法指导检测,因此尽管格式更改,插入/删除的注释,重命名的变量甚至某些插入/删除的语句,它仍将查找克隆。

该网站在Google的Closure库中运行了一个示例CloneDR。


有人试过这个吗?找不到任何下载或订购按钮...
Sven Hecht 2010年

从2011年1月开始,有一个下载链接,您可以用来获取CloneDR的eval副本以用于JavaScript(或其他多种语言)。
伊拉·巴克斯特

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.