当我做一些愚蠢的事情(比如变量名的拼写错误)时,我习惯于让我的编译器抱怨,但 JavaScript 有让这个通过的习惯。
有 JavaScript 的静态分析工具吗?
当我做一些愚蠢的事情(比如变量名的拼写错误)时,我习惯于让我的编译器抱怨,但 JavaScript 有让这个通过的习惯。
有 JavaScript 的静态分析工具吗?
2017 年更新答案:是的。使用 ESLint。http://eslint.org
除了JSLint(已经在Flash Sheridan 的回答中提到)和Closure 编译器(之前在awhyte 的回答中提到)之外,我还从运行 JSHint 和 PHP CodeSniffer 中获得了很多好处。截至 2012 年,所有四个工具都是免费开源的,并且背后有一个庞大而活跃的开发者社区。它们在执行的检查类型上都有点不同(我认为是互补的):
JSLint被设计成,现在仍然是 Douglas Crockford 的个人 linting 工具。它附带了一个很棒的默认规则集——Crockford 自己的,随着他继续学习JavaScript 及其陷阱而不断更新。JSLint非常固执己见,这通常被视为一件好事。因此,您可以(有意地)有限地配置或禁用单个规则。但这会使将 JSLint 应用于遗留代码变得困难。
JSHint与 JSLint 非常相似(实际上它是作为 JSLint 的分支开始的),但通过命令行选项或文件配置或禁用所有 JSLint 的检查更容易/可能。.jshintrc
我特别喜欢我可以告诉 JSHint 报告文件中的所有错误,即使有数百个错误。相比之下,尽管 JSLint 确实有一个maxerr
配置选项,但它通常会在尝试处理包含大量错误的文件时相对较早地退出。
Closure 编译器非常有用,因为如果代码不能用 Closure 编译,你可以很确定地感觉到所说的代码在某些基本方面被深深地冲洗了。闭包编译可能是 JS 世界中最接近“解释器”语法检查的东西,例如php -l
或ruby -c
闭包还会警告您潜在的问题,例如缺少参数和未声明或重新定义的变量。如果您没有看到预期的警告,请尝试通过调用 Closure 选项来提高警告级别--warning_level VERBOSE
PHP CodeSniffer 可以解析 JavaScript以及 PHP 和 CSS。CodeSniffer 附带了几种不同的编码标准,(比如phpcs -i
看看它们),其中包括许多对 JavaScript 代码有用的嗅探,包括检查内联控制结构和多余的空格。
这是PHP CodeSniffer 1.3.6 版本中可用的 JavaScript 嗅探列表,这是一个自定义规则集,可让您一次运行它们。 使用自定义规则集,您可以轻松挑选要应用的规则。如果您想强制执行开箱即用不支持的特定“房屋风格”,您甚至可以编写自己的嗅探器。Afaik CodeSniffer 是这里提到的四个工具中唯一支持自定义和创建新静态分析规则的工具。不过需要注意的是:CodeSniffer 也是上述所有工具中运行速度最慢的。
我同意 JSLint 是最好的起点。请注意,JavaScript Lint与JSLint不同。我还建议检查一下JSure,在我有限的测试中,它比其中任何一个都好,尽管在实施中有一些粗糙的边缘——英特尔 Mac 版本在启动时崩溃了,尽管 PowerPC 版本即使在英特尔上也运行良好, Linux 版本也运行良好。(开发商 Berke Durak 说他会在这个问题修复后回复我,但我还没有收到他的消息。)
不要对 JavaScript 静态分析的期望与从优秀的 C 检查器获得的期望一样多。正如 Durak 告诉我的,“由于 Javascript 的动态特性,任何重要的分析都非常困难。”</p>
(另一个更隐蔽的仅适用于 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“压缩器”工具也可以产生警告,但还没有尝试过。
我对基于 Eclipse 构建的 Aptana IDE 不太满意,但其他人喜欢它。请参阅 JS IDE 的 Stack Overflow 讨论。
IntelliJ IDE(我上次检查时不是免费的)具有出色的 JS 支持。它会在您键入时检测并突出显示拼写错误的变量和方法等。它也有自动完成功能。
总之,JSLint、JSHint、Plato、ESLint、Google Closure-Linter 是可用的工具。我在试用适用于 Windows 的 Google Closure-Linter 时遇到了安装问题。但是,它确实在网页上提到它对 Windows 的支持是实验性的。我找到并尝试了另一种效果很好的工具。这是它的链接: http ://esprima.org/
此外,这是工具 Esprima 的 github 链接: https ://github.com/ariya/esprima
您可以在这个Wiki中看到一些用于 JavaScript 静态代码分析的工具。
Wiki 中的一个工具是DeepScan ,但本文未提及。它的重点是发现运行时错误和质量问题,而不是 linter 的编码约定。它还涵盖了 TypeScript、React 和 Vue.js。
你可以在你的 GitHub 项目中尝试一下。
我试用了 ESlint,发现它很好。你也可以在那里添加自定义规则。这里是 github repo:https ://github.com/nzakas/eslint ,这里是它的介绍:http://www。 nczonline.net/blog/2013/07/16/introducing-eslint/
可以在 Mozilla Wiki 的Security/B2G/JavaScript 代码分析中找到比通用列表更注重安全性的内容
本文档的目的是收集适合包含在即将到来的 Mozilla 项目中或供内部使用的 JavaScript 代码分析工具。
此外,至少还有一种商业产品可以进行安全分析: Burp 获得了新的 JavaScript 分析功能
Burp 的最新版本包括一个用于 JavaScript 代码静态分析的新引擎。这使 Burp Scanner 能够报告一系列新漏洞,包括:
- 基于 DOM 的 XSS
- JavaScript 注入
- 客户端 SQL 注入
- WebSocket 劫持
- 本地文件路径操作
- 基于DOM的开放重定向
- Cookie 操作
- Ajax 请求头操作
- 基于 DOM 的拒绝服务
- 网络消息操作
- HTML5 存储操作
在商业领域,Coverity 静态分析从 7.7 版(2015 年中)开始支持对 JavaScript 的分析。关于您对拼写错误的具体询问,我在最新版本(8.0,2016 年初)中出现的宠物项目确实在程序元素的名称中发现拼写错误。
作为项目的关键开发人员,请接受我的无耻插件:虽然还没有像古老的C/C++ 分析那样成熟,但Coverity 的 JavaScript 分析与很多引擎共享相同的引擎,同样专注于寻找高价值缺陷和低价值缺陷。误报缺陷报告的比率。除了发现一般编程错误外,我们还更加关注发现 JavaScript(和其他语言)中的安全缺陷。
现在,这里有一些它发现的错别字(确切的错别字留给读者作为练习,以强调这些错字是多么容易被忽略):
commands-packages-query.js:(稳定链接) (最新版本)
我喜欢Jslint的这种东西......
Flow进行带注释和不带注释的静态分析。
如果您需要注解,语法与TypeScript兼容。
安装包:
npm install --global flow-bin
还有一些工具。看看gulp-flowtype和SublimeLinter-flow
JSAnalyse 刚刚在 codeplex 上发布。它是一个分析javascript文件之间依赖关系的工具。您甚至可以定义允许的依赖项,JSAnalysis 会检查定义的规则是否得到满足。即使在大型项目中,这也允许跟踪 javascript 依赖项并拥有干净的架构。
JSAnalyse 可以作为命令行工具执行,也可以通过 Visual Studio Layer Diagramm 进行配置。它也很容易集成到构建中。通过门控签入,您可以控制依赖关系。
我们的SD ECMAScript CloneDR是一种工具,用于在大型 JavaScript 源代码库中查找重复代码的准确副本和几乎未命中的副本。
它使用语言语法来指导检测,因此无论格式更改、插入/删除注释、重命名变量甚至是一些插入/删除语句,它都能找到克隆。
该站点有一个在 Google 的 Closure 库上运行的示例 CloneDR。
完全披露,我支持:http ://www.toptensoftware.com/minime ,它进行缩小、混淆和一组合理的 lint 样式检查。