Are there any JavaScript static analysis tools?

当我做一些愚蠢的事情,比如在变量名上输入错误时,我已经习惯了让我的编译器抱怨,但是 JavaScript 有一个习惯,就是让这种情况过去。

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

76806 次浏览

我喜欢 Jslint的这种东西..。

我同意 JSLint 是最好的起点。请注意,JavaScript LintJSLint是不同的。我还建议检查一下 当然,在我有限的测试中,它的表现比这两个版本都要好,尽管在实现中有一些粗糙的地方ーー对我来说,英特尔 Mac 版本在启动时崩溃了,尽管 PowerPC 版本甚至在英特尔上运行良好,Linux 版本也运行良好。(开发商伯克•杜拉克(Berke Durak)表示,这个问题解决后,他会给我回复,但我还没有他的消息。)

不要期望从 JavaScript 静态分析得到像从一个好的 C 检查器那样多的东西。正如 Durak 告诉我的,“由于 Javascript 的动态特性,任何非平凡的分析都是非常困难的。”

(另一个更加晦涩的 Mac 专用错误,这次使用的是 JSLint 的 Konfabrator 小部件: 将 BBEdit 文档图标拖到小部件上会将文档移到垃圾桶。道格拉斯·克罗克福特开发者还没有在 Mac 上尝试过这个插件。)

2009年8月10日: 今天在 静态分析研讨会,Simon Holm Jensen 发表了一篇关于 TAJS: JavaScript 类型分析器的论文,作者是 Anders Møller 和 Peter Thiemann。报纸上没有提到上述的工具,但是 Jensen 告诉我他已经看过其中的一些,并没有被打动。TAJS 的代码将在今年夏天的某个时候发布。

Google 的“ Closure”JS 编译器 在编译时产生可配置的警告和错误。它肯定会发现拼写错误的变量和方法,加上异能错误。如果您愿意以闭包的方式编写 JsDoc,那么它也可以对类型信息做很多事情。

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

我在基于 Eclipse 的 Aptana IDE 上运气不太好,但是其他人喜欢它。请参见关于 JSIDE 的堆栈溢出的讨论。

IntelliJIDE,据我所知并不是免费的,它有非常棒的 JS 支持。它将在您键入时检测并突出显示拼写错误的 vars 和方法,等等。还有自动补全功能。

我们的 克隆是一个工具,用于在大型 JavaScript 源代码库中查找重复代码的精确副本和差点错过的副本。

它使用语言语法来指导检测,所以不管格式变化、插入/删除的注释、重命名的变量,甚至一些插入/删除的语句,它都会找到克隆。

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

Full disclosure, I'm behind this: http://www.toptensoftware.com/minime which does minification, obfuscation and a reasonable set of lint style checks.

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

JSAnalyse 可以作为命令行工具执行,也可以通过 VisualStudio 层关系图进行配置。也很容易集成到构建中。通过门限签入,可以控制依赖关系。

http://jsanalyse.codeplex.com/

更新答案,2017: 是的,使用 ESLint


除了 JSLint(已经在 飞侠谢里登的回答中提到)和 闭包编译器(以前在 awhyte's answer中提到) ,我还从运行 JSHintPHP 代码嗅探器中获得了很多好处。截至2012年,所有这四个工具都是免费开源的,背后有一个庞大而活跃的开发者社区。它们在执行的检查类型上各有不同(我认为是互补的) :

JSLint 被设计成,并且仍然是道格拉斯·克罗克福特的个人 linting 工具。它附带了一个 很好默认规则集——克罗克福德自己的 不断更新,就像他对 JavaScript 及其缺陷的 continues to learn一样。JSLint 是 非常固执己见,而这通常是 seen as a good thing.。因此(有意地)可以使用 限额来配置或禁用单个规则。但是这可能使得将 JSLint 应用于遗留代码变得很困难。

JSHint 非常类似于 JSLint (实际上它是作为 JSLint fork 的 开始了生命) ,但是通过命令行选项或者通过 .jshintrc文件配置或禁用进行所有 JSLint 检查更容易/可能。

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

Closure 编译器 非常有用,因为如果代码 不会使用 Closure 进行编译,您可以非常肯定地感觉到代码 以某种基本的方式被深深地淹没了。闭包编译可能是 JS 世界中最接近于“解释器”语法检查(如 php -lruby -c)的东西

Closure also 警告你潜在的问题 such as missing parameters and undeclared or redefined variables. If you aren't seeing the warnings you expect, try increasing the warning level by invoking Closure with an option of --warning_level VERBOSE

PHP CodeSniffer 可以解析 JavaScript以及 PHP 和 CSS。CodeSniffer 提供了几种不同的编码标准(比如 phpcs -i) ,其中包括许多有用的 JavaScript 代码嗅探,包括针对 嵌入式控制结构嵌入式控制结构多余的空格的检查。

这里是一个 JavaScript 嗅探器列表可在 PHP CodeSniffer 版本1.3.6,这里是一个 允许您同时运行它们的自定义规则集。使用自定义规则集,它很容易 挑选规则你想要应用。你甚至可以 write your own sniffs,如果你想强制一个特定的“房子风格”,是不支持开箱即用。Afaik CodeSniffer 是这里提到的四个工具中唯一支持定制和创建新的静态分析规则的工具。但需要注意的是: CodeSniffer 也是所提到的工具中运行速度最慢的。

我试过埃斯林特,觉得不错。.您也可以在那里添加自定义规则。.这是 github repo: https://github.com/nzakas/eslint,这是它的介绍: http://www.nczonline.net/blog/2013/07/16/introducing-eslint/

总之,JSLint、 JSHint、 Plato、 ESLint、 Google Closure-Linter 都是可用的工具。 我在试用 Google Closure-Linter for Windows 时遇到了安装问题。但是,它确实在网页上提到它对 Windows 的支持是试验性的。 我发现并尝试了另一个工具,它工作得很好,下面是链接: Http://esprima.org/

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

安全/B2G/JavaScript 代码分析的 MozillaWiki 上可以找到比通用列表更关注安全性的内容

The purpose of this document is to collect JavaScript code analysis 适合包括在未来的 Mozilla 项目或 内部使用。

此外,至少有一个商业产品,做安全分析: Burp 获得了新的 JavaScript 分析能力

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

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

Flow 使用和不使用注释进行静态分析。

如果需要注释,语法与 打字机兼容。

Install the package with :

npm install --global flow-bin

还有一些工具,看看 吞吐流型吞吐流型吞吐流型,也许还有 SublimLinter-flow

在商业领域, 覆盖静态分析 支持7.7版本(2015年中期)的 JavaScript 分析。关于你的具体问题打字错误,我的宠物项目出现在最新版本(8.0,2016年初) 确实发现了拼写错误的节目元素的名称。

作为这个项目的关键开发者,请接受我无耻的说法: 尽管 Coverity 的 JavaScript 分析还没有 受人尊敬的 C/C + + 分析那么成熟,但它与 受人尊敬的 C/C + + 分析共享了大部分相同的引擎,同样关注于发现高价值的缺陷和低误报率的缺陷报告。除了发现一般的编程错误之外,我们还将更加关注于发现 JavaScript (和其他语言)中的安全缺陷。

现在,它发现了一些拼写错误(作为一种练习留给读者,以强调这些错误是多么容易被忽视) :

Js: (稳定链接) (最新修订)

Commands- 包-query. js: (稳定链接) (latest revision)

series-pie-tests.js: (稳定链接) (最新修订)

大纲 _ case. js: (稳定链接) (最新修订)

你可以在这个 维基百科中看到一些 JavaScript 静态程序分析的工具。

Wiki 中的一个工具是 深度扫描,但在本文中没有提到。 它的重点是发现运行时错误和质量问题,而不是编码行的约定。它还涵盖了 TypeScript、 React 和 Vue.js。

您可以在 GitHub 项目中尝试使用它。