有没有JavaScript静态分析工具?[已关闭]

2022-08-30 05:07:40

当我做一些愚蠢的事情时,我习惯于让我的编译器抱怨,比如变量名称上的拼写错误,但JavaScript习惯于让它通过。

有没有针对JavaScript的静态分析工具?


答案 1

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


除了JSLint(在Flash Sheridan的答案中已经提到过)和闭包编译器(之前在awhyte的答案中提到过)之外,我还从运行JSHintPHP CodeSniffer中受益匪浅。截至2012年,所有四个工具都是免费的开源工具,背后都有一个庞大而活跃的开发者社区。它们在执行的检查类型上各自略有不同(我认为是互补的):

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

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

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

Closure编译器非常有用,因为如果代码不能使用 Closure 编译,你可以非常确定所述代码以某种基本方式被深深地吸收了。闭包编译可能是JS世界中最接近“解释器”语法检查的东西,例如或php -lruby -c

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

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

以下是自版本 1.3.6 起在 PHP CodeSniffer 中可用的 JavaScript 嗅探列表,下面是一个自定义规则集,允许您一次运行所有规则集。使用自定义规则集,可以轻松选取和选择要应用的规则。你甚至可以写自己的嗅探,如果你想强制执行一个特定的“房子风格”,这是开箱即用的。Afaik CodeSniffer是这里提到的四个工具中唯一支持自定义和创建新的静态分析规则的工具。但有一点需要注意:CodeSniffer也是上述任何工具中运行速度最慢的工具。


答案 2

我同意JSLint是最好的起点。请注意,JavaScript LintJSLint 不同。我还建议看看JSure,在我有限的测试中,JSure的表现比它们中的任何一个都好,尽管在实现上有一些粗糙的边缘 - 英特尔Mac版本在启动时崩溃了,尽管PowerPC版本即使在英特尔上运行良好,Linux版本也运行良好。(开发人员伯克·杜拉克(Berke Durak)说,当这个问题得到解决时,他会回复我,但我还没有收到他的消息。

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

(另一个更晦涩难懂的Mac专用错误,这次是JSLint的Konfabulator小部件:将BBEdit文档图标拖到小部件上会将文档移动到垃圾箱中。开发人员Douglas Crockford没有在Mac上尝试过这个小部件。

2009 年 8 月 10 日:今天在静态分析研讨会上,Simon Holm Jensen 发表了一篇关于 TAJS: Type Analyzer for JavaScript 的论文,与 Anders Møller 和 Peter Thiemann 合著。这篇论文没有提到上述工具,但詹森告诉我,他看过其中一些工具,并没有留下深刻的印象。TAJS的代码应该在今年夏天的某个时候提供。