抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

静态分析工具综述:Roodi、Rufus、Reek 和 Flay

2008 年 11 月 26 日

静态分析工具能够保证代码的质量,发现并警告潜在的 bug。静态编译语言的编译器经常运行静态分析检查,然后以警告的形式报告潜在的问题。流行的独立分析工具有 C 的 lint Smalltalk 的 Lint 等等,许多现代的 IDE 同样也能够对代码进行静态分析,还能够随着代码的编辑进行增量的检查。

在很长的时间里,由于没有访问 Ruby 资源中抽象语法树(AST)的标准方法,Ruby 在静态分析工具方面总是不能得心应手。解决方案之一是使用 ParseTree 这个 gem ,这个工具使用了原生扩展,来实现对 Ruby 代码解析树的访问。ParseTree 也只是在 Ruby 1.8 中可用,不过似乎 1.9 不会继续支持它(Ruby 1.9 将会支持 Ripper,这个库支持对源文件进行解析,但是不支持实时访问解析树)。ParseTree 现在并不能很好支持那些新的 Ruby 实现。

再来介绍一下 ruby_parser ,这是一个 Ruby 的解析器,它是用 Ruby 编写的,并且承诺改进这些问题。这个项目最近发布了 2.0 版本,不但改善了性能,而且将行号作为元数据加入到 AST 中。后者对于静态分析工具是非常重要的,因为这些工具需要报告发现问题的位置。

有一点至关重要,那就是所有现存的 Ruby IDE 都是使用 Java(例如 Aptana 或 3rdRail 等基于 Eclipse 的 IDE、Netbeans 的 Ruby 支持,或者 JetBrains 的 RubyMine ) 或者.NET(基于 Visual Studio 的 Ruby In Steel)编写而成的。所有这些 IDE 都包含对 Ruby 代码的静态分析代码,但是它们都不是 Ruby 编写的。基于 Java 或者.NET 语言,并采用 Ruby 解析器和 AST 的静态分析代码,显然不能够支持 MRI 或者其他的 Ruby 实现方式。UnifiedRuby 派生自 ParseTree,对 ParseTree 的输出进行整理加工,还与 ruby_parser 相结合,它现在可以解析 Ruby 的源代码,并且能够通过纯 Ruby 来进行分析。

在过去几个月里,发布了一系列的静态分析工具。

Flay ,这是由 Ryan Davis 编写的工具,能够检查重复的 codebase。这个工具使用了 AST 而不是直接分析源代码,从而能够结构化地比较代码。拷贝或者粘贴的代码即使经过了些许修改,也能够被检测到。Ryan 之前曾经发布过另外一个静态分析工具 flog ,这个工具主要根据其内置的各种不良代码匹配模式计算 codebase 的得分,例如过多的依赖等等。Flay 和 Flog 都能够使用命令行检查 codebase。Flay 使用 ruby_parser 对 Ruby 代码进行解析。

Reek 由 Kevin Rutherford 编写,是一个“ ruby 代码的怪味道嗅探器”。它能够检查非常长的方法体、臃肿的类、错误的名称等等。这些检查是通过继承自 SexpProcessor,并且访问 AST 来实现的。Reek 的代码可以在 Github 上下载。

Roodi 是一个与 reek 非常相似的工具,它能够对 codebase 进行一系列的检查。Roodi 检查方法或模块是否符合命名规则,或者最大参数数目等是否一致等等。其他的检查项目包括提供诸如避免 for 循环之类的建议等等。在 YAML 文件中包含了其他附加功能的配置,而且配置起来非常方便。同样地,编写新的检查类也非常容易。检查器的类是通过注册 AST 的节点,然后监控这个节点的子树来实现检查功能的。

Rufus ,这是一个由 John Mettraux 编写的工具,这个工具能够检查 Ruby 中不需要或者不安全的代码。Rufus 的库能够在加载某些 Ruby 源代码之前检查它们。例如,加载一个只有一行(例如 exit)代码的 Ruby 文件可不是什么好主意。这个库是可配置的,能够自定义匹配模式,决定哪些代码将要被排除掉。

你打算把这些工具添加到持续集成的配置中吗?你希望对代码进行什么检查,或者打算自己编写哪些检查功能呢?

查看英文原文: Static Analysis Tools Roundup: Roodi, Rufus, Reek, Flay

2008 年 11 月 26 日 10:191017
用户头像

发布了 90 篇内容, 共 28.9 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

Substrate Builders Program里程碑更新:2021年8月

Patract

以太坊 rust polkadot Patract Wasm智能合约

LeetCode题解:217. 存在重复元素,哈希表,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

Go语言chan实现原理,彻底搞懂chan读写机制

微客鸟窝

golang 8 月日更

交易复制平台FNDZ,将以DeFi为核心打造牛市交易员

区块链小八歌

EMQ 映云科技成为开源项目 Vue.js 定期捐赠者

EMQ映云科技

Java 开源 前端 开源项目 emq

机会!痛点!难点!中国游戏泛娱乐企业出海攻略全解析

环信

游戏出海 直播 社交APP出海 泛娱乐社交

多线程、分布式、高并发都不懂?你拿什么跳槽?

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

BHEX Chain BBS解读:跨链桥的安全时代

区块链小八歌

【LeetCode】学生考勤Java题解

HQ数字卡

算法 LeetCode 8月日更

webrtc Rtp/rtcp (1)

糖米唐爹

MySQL 系列教程之(六)DML 操作:数据的增删改

若尘

数据库 MySQL 数据库 八月日更

linux工具之TC

糖米唐爹

Vue进阶(四十):ref ($refs) 用法详解

No Silver Bullet

Vue 八月日更

如何找到程序崩溃的 “凶手” ?

神策技术社区

数据库 程序员 埋点

前端基础二之css篇

ベ布小禅

8 月日更

从“人工”到“人工智能”,聊一聊本届东京奥运会的AI黑科技

行者AI

centos8 mediasoup 搭建

糖米唐爹

WebRTC mediasoup

史上最大DDoS攻击之争:这三次攻击,谁才是「最大」?

百度开发者中心

最佳实践 方法论 信息安全 案例分析 行业深度

老板不让用 AFNetworking,我该怎么办?

神策技术社区

前端 后端 数据 数据采集

价值连城 图灵奖得主Yoshua Bengio约书亚·本吉奥的采访 给AI从业者的建议 John 易筋 ARTS 打卡 Week 60

John(易筋)

ARTS 打卡计划

webrtc AlrDetector

糖米唐爹

七步实现列表点击事件的采集

神策技术社区

前端 后端 代码

模块5作业

gevin

架构实战营

使用账号密码来操作github? NO!

程序那些事

Java GitHub 程序那些事

FNDZ构建的交易复制生态,让DeFi回归价值本身

股市老人币圈新

基于KubeEdge实现中国移动10086客服云边协同平台

华为云原生团队

云计算 开源 运维 边缘计算 边缘技术

用Python爬取《王者荣耀》英雄皮肤数据并可视化分析,用图说话

Python研究者

8 月日更

Android技术分享| 自定义ViewGroup实现直播间大小屏无缝切换

anyRTC开发者

android 音视频 实时通信 Android开发 大小屏切换

如何理解 Java 多线程

HoneyMoose

大一一个学期学多少编程算正常?

沉默王二

编程

千亿级模型在离线一致性保障方案详解

百度Geek说

百度 测试 后端

Study Go: From Zero to Hero

Study Go: From Zero to Hero

静态分析工具综述:Roodi、Rufus、Reek和Flay-InfoQ