【问题标题】:Are there any JavaScript static analysis tools? [closed]有没有 JavaScript 静态分析工具? [关闭]
【发布时间】:2010-10-06 18:47:53
【问题描述】:

当我做一些愚蠢的事情(比如变量名的拼写错误)时,我习惯于让我的编译器抱怨,但 JavaScript 有让这种情况通过的习惯。

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

【问题讨论】:

  • 现在打字稿是你的朋友——它支持 javascript 隐式类型检查,如果你想 100% 进行检查,你可以编写 jsdoc3 或 google 闭包注释,它会从那里推断类型。 vscode 或 webstorm 等编辑器开箱即用地支持它:github.com/Microsoft/TypeScript/wiki/…

标签: javascript static-analysis


【解决方案1】:

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


除了JSLint(已经在Flash Sheridan's answer中提到)和Closure compiler(之前在awhyte's answer中提到)我还从运行JSHintPHP CodeSniffer中获得了很多好处。截至 2012 年,所有四个工具都是免费开源的,并且背后有一个庞大而活跃的开发者社区。它们在执行的检查类型上各有不同(我认为是互补的):

JSLint 被设计为,并且仍然是 Douglas Crockford 的个人 linting 工具。它附带了一个很棒的默认规则集——Crockford 自己的 constantly updatedcontinues to learn 关于 JavaScript 及其陷阱的规则集。 JSLint 是highly opinionated,这通常是seen as a good thing. 因此(有意)有一个limited amount 可以用来配置或禁用个别规则。但这会使 JSLint 难以应用于遗留代码。

JSHint 与 JSLint 非常相似(实际上它是 began life 作为 JSLint 的分支),但通过命令行选项或 @987654335 对 configure or disable 所有 JSLint 的检查更容易/可能@。

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

闭包编译器非常有用,如果代码不会用闭包编译,你可以非常确定所说的代码以某种根本的方式深深地冲洗。闭包编译可能是 JS 世界中最接近“解释器”语法检查的东西,如 php -lruby -c

还关闭warns you about potential issues,例如缺少参数和未声明或重新定义的变量。如果您没有看到预期的警告,请尝试通过使用 --warning_level VERBOSE 选项调用 Closure 来提高警告级别

PHP CodeSniffer can parse JavaScript 以及 PHP 和 CSS。 CodeSniffer 附带了几种不同的编码标准(比如phpcs -i 来查看它们),其中包括许多有用的 JavaScript 代码嗅探,包括对 inline control structuressuperfluous whitespace 的检查。

这是 PHP CodeSniffer 1.3.6 版本中可用的list of JavaScript sniffs,这是custom ruleset that would allow you to run them all at once. 使用自定义规则集,很容易pick and choose the rules 要应用。如果您想强制执行开箱即用不支持的特定“房屋风格”,您甚至可以write your own sniffs。 Afaik CodeSniffer 是这里提到的四个工具中唯一支持自定义和创建新静态分析规则的工具。不过需要注意的是:CodeSniffer 也是上述所有工具中运行速度最慢的。

【讨论】:

  • JavaScript 代码的复制粘贴检测现在可通过 CPD 进行。据我所知,这是第一个强大的 JavaScript 开源代码复制工具! pmd.sourceforge.net 并另见问题“是否有类似 CPD 的 JavaScript 工具?” stackoverflow.com/a/13745190/55478
【解决方案2】:

我同意 JSLint 是最好的起点。请注意,JavaScript LintJSLint 不同。我还建议检查JSure,在我有限的测试中,它比它们中的任何一个都好,尽管在实施中有一些粗糙的边缘——英特尔 Mac 版本在启动时崩溃了,尽管 PowerPC 版本运行良好,即使在英特尔和 Linux 版本也运行良好。 (开发者 Berke Durak 说他会在这个问题修复后回复我,但我还没有收到他的消息。)

不要对 JavaScript 静态分析的期望与从优秀的 C 检查器获得的期望一样多。正如 Durak 告诉我的,“由于 Javascript 的动态特性,任何重要的分析都非常困难。”

(另一个更隐蔽的仅适用于 Mac 的错误,这次是 JSLint 的 Konfabulator 小部件:将 BBEdit 文档图标拖到小部件上会将文档移动到垃圾箱。开发人员 Douglas Crockford 没有在马克)

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

【讨论】:

  • @UpTheCreek:JSLint 在 GitHub 上可用。
  • @Dave 哦,对了,太好了:)
  • TAJS 的源代码现已发布。
【解决方案3】:

Google's "Closure" JS compiler 在编译时产生可配置的警告和错误。它肯定会发现拼写错误的变量和方法,以及数量错误。如果您愿意以 Closure 方式编写 JsDoc,它也可以在类型信息方面做很多事情。

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

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      你可以在你的 GitHub 项目中尝试一下。

      【讨论】:

        【解决方案6】:

        我试用了 ESlint,发现它很好..你也可以在那里添加自定义规则..这是 github repo:https://github.com/nzakas/eslint,这是它的介绍:http://www.nczonline.net/blog/2013/07/16/introducing-eslint/

        【讨论】:

          【解决方案7】:

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

          本文档的目的是收集 JavaScript 代码分析 适合包含在即将到来的 Mozilla 项目或 内部使用。

          还有至少一种商业产品可以进行安全分析:Burp gets new JavaScript analysis capabilities

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

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

          【讨论】:

            【解决方案8】:

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

            作为项目的关键开发人员,请接受我的无耻插件:虽然还没有 venerated C/C++ analysis 成熟,但 Coverity 的 JavaScript 分析与许多相同的引擎共享相同的引擎,同样专注于通过误报缺陷报告率低。除了发现一般编程错误外,我们还更加关注发现 JavaScript(和其他语言)中的安全缺陷。

            现在,它发现了一些错别字(确切的错别字留给读者作为练习,以强调这些错字是多么容易被忽略):

            merge.js:(stable link)(latest revision)

            commands-packages-query.js:(stable link)(latest revision)

            series-pie-tests.js: (stable link) (latest revision)

            outline_case.js:(stable link)(latest revision)

            【讨论】:

              【解决方案9】:

              我喜欢Jslint这种东西...

              【讨论】:

              • 酷。我在rockstarapps.com/joomla-1.5.8/products/… 找到了一个 JSLint 的 Eclipse 插件,看起来也不错。请注意,需要从“jsLex 1.2.2 Beta 版本的 Eclipse 更新站点”安装才能获得 JSLint 功能。
              【解决方案10】:

              Flow 进行带注释和不带注释的静态分析。

              如果需要注解,语法兼容TypeScript

              安装package

              npm install --global flow-bin
              

              还有一些工具。看看gulp-flowtype 或者SublimeLinter-flow

              【讨论】:

                【解决方案11】:

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

                JSAnalyse 可以作为命令行工具执行,也可以通过 Visual Studio Layer Diagramm 进行配置。它也很容易集成到构建中。通过门控签入,您可以控制依赖关系。

                http://jsanalyse.codeplex.com/

                【讨论】:

                  【解决方案12】:

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

                  它使用语言语法来指导检测,因此无论格式更改、插入/删除的 cmets、重命名的变量甚至是一些插入/删除的语句,它都能找到克隆。

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

                  【讨论】:

                  • 有人试过这个吗?没有找到任何下载或订购按钮...
                  • ...自 2011 年 1 月以来...有一个下载链接可用于获取 CloneDR for JavaScript(或其他多种语言)的评估副本。
                  【解决方案13】:

                  完全披露,我支持这个:http://www.toptensoftware.com/minime,它进行缩小、混淆和一组合理的 lint 样式检查。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2023-03-14
                    • 2010-09-13
                    • 2010-09-10
                    • 1970-01-01
                    • 2010-10-05
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-08-29
                    相关资源
                    最近更新 更多