AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

Facebook 开源其 Java 竞争条件检测工具 RacerD

  • 2018-01-11
  • 本文字数:1416 字

    阅读完需:约 5 分钟

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

由 Facebook 开源的静态分析工具 Infer,现已支持使用 RacerD 检测 Java 代码中竞争条件。RacerD 使用锁机制或@ThreadSafe注解,识别类中各方法间的竞争条件。

去年,Facebook 就已在生产代码中使用了 RacerD,并在代码提交生产前检测到了一千多处的多线程问题。现在,如果 Java 开发人员使用 Infer 去检测 Java 代码中的软件缺陷,同样可以使用 RacerD 的并发检测能力。

竞争条件是一种并发错误或软件缺陷。如果两个访问同一对象的线程(其中至少有一个需要做写操作)间没有做适当的同步操作,这时就会引发竞争条件,进而导致线程的执行存在彼此重叠。并发问题难以调试,更难以在发生问题后重现现场。

RacerD 可以大规模快速并发地执行一些有用的分析。RacerD 之所以可以做快速分析,原因在于它在检测并发问题时并没有非力图去检查整个代码库,而是仅检查那些它认为是并发运行的代码。

RacerD 检查的类、方法和接口定义中可并发运行的代码。这些代码或者是使用@ThreadSafe注解的、或者是根据关键字synchronized所创建锁而识别的。如果一个类或结构使用了@ThreadSafe注解,那么 RacerD 也会评估该类或实现的所有子类。为增加代码覆盖,RacerD 还额外添加了一些有用的注解,包括@ThreadConfined@Functional@ReturnsOwnership@VisibleForTesting

启动 RacerD 分析,需要在命令行调用命令infer。该命令可与其它 Infer 分析一并运行,也可以与只允许 RacerD 运行的infer --racerd-only命令一并运行。例如,输入命令infer --racerd-only -- javac StockPortfolio.java,将会对StockPortfolio.java运行 RacerD。

下面给出一个例子代码。RacerD 在检查该例子代码时,会对其中的竞争条件给出警告。

复制代码
@ThreadSafe
public class StockPortfolio {
int shares = 0;
public void buy(int count) {
if (count > 0) {
shares += count;
}
}
public int sell(int count){
if (count >= 0 && shares - count >= 0) {
shares -= count;
return shares;
} else {
return 0;
}
}
}

RacerD 会发现上面代码中的软件缺陷:

复制代码
Read/Write race. Public method int StockPortfolio.sell(int) reads from field StockPortfolio.shares. Potentially races with writes in methods void StockPortfolio.buy(int), int StockPortfolio.sell(int)

可以看到,RacerD 对代码中包含有未保护写、读写竞争等给出了警告。当前 RacerD 具有局限性,它只检测数据竞争情况,并不检测其它一些并发问题,例如死锁或原子性。在下面一些情况下,RacerD 会漏掉其中的数据竞争问题:

  • 别名(aliasing);
  • 本地定义对象溢出了范围;
  • 使用不同的锁访问受保护对象;
  • 本地对象包含有非属主对象;
  • 使用了弱引用内存,以及 Java 的volatile关键字。

RacerD 的这些局限性,源自于其设计目标针对的是降低误报率,即便会导致一些漏报。

RacerD 的共同作者 Sam Blackshear 和 Peter O’Hearn 在一份声明中指出:

Infer 当前已在 Facebook 使用,一种方式是批处理部署,另一种方式是作为参与代码审核的机器人。部署用于代码审核的 Infer,是作为 Facebook 持续集成系统的一部分运行。对于开发人员提交的每次代码更改,持续集成将 Infer 与其它一些编译和测试任务一并运行。

RacerD 的代码开源提供在 GitHub 上。更多细节,可参见用户指南

查看英文原文: Facebook Open-Sources RacerD - Java Race Condition Detector

2018-01-11 18:005723
用户头像

发布了 391 篇内容, 共 148.3 次阅读, 收获喜欢 257 次。

关注

评论

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

TiDB x 汉口银行丨分布式数据库应用实践

PingCAP

MySQL 数据库 分布式 银行 TiDB

数据泄露定义以及危害简单讲解

行云管家

大数据 数据安全 数据泄露 数据运维 数据安全运维

科技快讯丨浪潮海岳inBuilder荣获两项开源大奖

inBuilder低代码平台

信创发展 再添一城!广州亚信技术携AntDB数据库入围广州市软件和信创产业链重点企业代表名单

亚信AntDB数据库

AntDB数据库

“创新深化 数实融合”,AntDB数据库邀您参与“2023世界数字经济大会暨第十三届智慧城市与智能经济博览会”

亚信AntDB数据库

AntDB数据库

AntDB数据库荣获 “2023年信创物联网优秀服务商”

亚信AntDB数据库

AntDB数据库

TiDB 企业版全新升级,平凯数据库核心特性全解读

PingCAP

数据库 TiDB 平凯数据库

一种动态实现核隔离的方法

天翼云开发者社区

云计算 运维

MySQL 到 TiDB:vivo 的 Hive Metastore 横向扩展之路

PingCAP

MySQL 数据库 TiDB

机器狗装上 ChatGPT 大脑当导游;AI 正在学习「超人的说服力」丨 RTE 开发者日报 Vol.73

声网

性能优化必读 | AntDB-M高性能设计之线程池协程模型

亚信AntDB数据库

AntDB数据库

AntDB-M的扩展功能,性能提升和热更新轻松搞定

亚信AntDB数据库

AntDB数据库

数据集成实现以及平台安装部署入门

RestCloud

ETL 数据集成

HarmonyOS师资培训:赋能万千开发者,助力鸿蒙生态繁荣

最新动态

数据库性能优化必读,AntDB-M全局统计信息

亚信AntDB数据库

AntDB数据库

亚信科技AntDB数据库荣膺“2023世界计算大会专题展优秀成果”

亚信AntDB数据库

AntDB数据库

简单聊聊远程协同运维定义以及优势-行云管家

行云管家

运维 远程系统 远程协同 协同运维

华锐技术何志东:证券核心交易系统分布式改造将迎来规模化落地阶段

PingCAP

MySQL 数据库 分布式 TiDB

于璠访谈录 | AI 框架应该和而不同?

开源雨林

开源 ai框架 昇思MindSpore AI for Science

目标识别不出来,根据指南配置了环境变量也没有用

矩视智能

深度学习 机器视觉

内置视图联动查看器,实现数据关联分析

观测云

可观测性 关联分析 #数据分析

Mac电脑UI/UX设计必备:Sketch 98.3中文激活版

胖墩儿不胖y

UI Mac软件 ui设计 矢量设计工具

Nginx工作原理

天翼云开发者社区

nginx 服务器

科技快讯丨超级“码”力!浪潮海岳inBuilder精彩亮相开放原子1024程序员节

inBuilder低代码平台

1024程序员节

百舸争流,奋楫笃行 国产数据库排行榜前10改写,AntDB数据库将继续前行

亚信AntDB数据库

AntDB数据库

精彩合集丨全“猿”出击!浪潮海岳inBuilder亮相1024程序员节

inBuilder低代码平台

1024程序员节

数字先锋| 出版行业如何破圈出彩?“一朵云”让文化铸魂与数智发展并行!

天翼云开发者社区

云计算

Facebook开源其Java竞争条件检测工具RacerD_Java_Kesha Williams_InfoQ精选文章