【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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:005123
用户头像

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

关注

评论

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

消息队列Kafka:入门基础

正向成长

kafka

开发利器——C语言必备实用第三方库

码哥比特

c c++ Linux 后端 框架

2.react心智模型(来来来,让大脑有react思维吧)

全栈潇晨

React React Hooks react源码

字幕组时代落幕,翻译的未来可能是?

字节跳动技术团队

【LeetCode】数组拆分Java题解

Albert

算法 LeetCode 2月春节不断更

揭秘登上2021春晚舞台的黑科技-XR技术

架构精进之路

黑科技 vr 春晚 XR MR

日记 2021年2月17日(周三)

Changing Lin

2月春节不断更

【LeetCode】重塑矩阵Java题解

Albert

算法 LeetCode 2月春节不断更

C语言第三方库Melon开箱即用之词法分析器使用

码哥比特

c c++ Linux 后端 框架

翻译:《实用的Python编程》01_05_Lists

codists

人工智能 后端 python 爬虫 列表 数据结构与算法

1.开篇(听说你还在艰难的啃react源码)

全栈潇晨

React React Hooks react源码

第四章作业-编写一个用例文档

秦挺

IDEA插件:快速删除Java代码中的注释

xiaoxi666

Java 代码注释 JavaParser

这是我的第一次JavaScript初级技巧

我是哪吒

JavaScript 学习 程序员 大前端 2月春节不断更

C语言实用第三方库Melon开箱即用之多线程模型

码哥比特

c c++ Linux 后端 框架

13. 如果自己写的 Python 程序出错了,怎么办?

梦想橡皮擦

python 爬虫 2月春节不断更

EternalWallet为您提供快速、便捷、低价的国际汇款服务

Geek_c610c0

【STM32】PWM 输出 (标准库)

AXYZdong

硬件 stm32 2月春节不断更

微信红包封面,2021年为啥突然火了?

架构精进之路

春节 微信红包封面 商业洞察

给hugo博客添加评论功能

远鹏

Hugo 静态博客 utterances

春节快过腻了?不妨关心下太空探索

脑极体

今日笔记

Nydia

第一次异地过年有感

石君

思考 情感

3.Fiber(我是在内存中的dom)

全栈潇晨

React React Hooks react源码

深度讲解背包问题:面试中每五道动态规划就有一道是背包模型 ...

宫水三叶的刷题日记

深度思考 面试 LeetCode 动态规划 数据结构与算法

【活动回顾】4步2小时,搭建爆火的语音聊天室

ZEGO即构

1480. 一维数组的动态和

小马哥

算法 七日更

写公号大半年,看看我都收获了些啥

架构精进之路

技术 总结 微信公众号 成长笔记

程序员成长第五篇:如何选择城市工作?

石云升

程序员 2月春节不断更 选择城市

ElasticSearch.03 - 基本原理

insight

elasticsearch 2月春节不断更

gradle中的增量构建

程序那些事

maven Gradle 程序那些事 构建工具

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