50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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

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

关注

评论

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

2020.10.05-2020.10.11 学习总结

icydolphin

极客大学架构师训练营

架构师训练营第四周总结

薛凯

轻量级业务中台开发框架,以DDD思想为基础,融合中台核心要素,赋能中台建设

高鹏

中台 业务中台 DDD 框架 中台架构

Redis - redis.conf - 中文翻译

大海

redis 缓存 翻译

spring-boot-route(十七)使用aop记录操作日志

Java旅途

Spring Boot aop

十三、深入Python字典和集合

刘润森

Python

从格力直播看品牌商的渠道变革

boshi

数字化转型 品牌 直播带货 优化业务

第四周作业

icydolphin

极客大学架构师训练营

Go 语言内存管理三部曲(二)解密栈内存管理

网管

堆栈 内存管理 内存布局 Go 语言

微服务已成Java开发的面试门槛,你连SpringCloud都不会怎么涨薪

Java架构之路

Java spring 编程 程序员 面试

架构师训练营第一周总结

薛凯

iOS底层原理之—dyld与objc的关联

iOSer

ios ios开发 iOS Developer dyld objc

阿里大牛原创技术好文精选整理:Redis+Nginx+设计模式+Spring全家桶+SQL+Dubbo

Java架构之路

Java 程序员 面试 编程语言

架构师训练营第一周课后练习

薛凯

Java进阶架构师面试手册:核心框架篇整理,助我斩获65W架构师Offer!

Java架构追梦

Java 学习 架构 面试 框架

架构师训练营第四周课后作业

Gosling

极客大学架构师训练营

ARTS Week13

丽子

架构师训练营第三周课后练习

薛凯

LeetCode题解:22. 括号生成,递归先生成再过滤,JavaScript,详细注释

Lee Chen

大前端 LeetCode

第四周 系统架构作业

蓝黑

极客大学架构师训练营

COSCon'20 & Apache Roadshow 来了,数据技术专场欢迎您

代立冬

每周花6小时跟清华大牛马士兵学Java:多线程高并发、JVM调优、算法、设计模式等

Java架构之路

Java 程序员 面试 算法 编程语言

一文带你轻松了解Python导入模块的各种命令

计算机与AI

Python

架构师训练营第三周总结

薛凯

架构师训练营第四周课后练习

薛凯

学习笔记丨数据结构与算法之贪心算法

Liuchengz.

贪心算法

来点不一样的: 精选200个Java技术面试真题,详解应聘Java程序员常见考点,在Github上标星89.6K

996小迁

编程 程序员 架构 面试

十四、深入Python条件和循坏

刘润森

Python

SpringBoot整合Jpa项目(含Jpa 原生sql语句介绍)

小Q

Java 架构 微服务 springboot jpa

[周末荐片]Undercover Billionaire

亚伦碎语

生活

分布式系统中的CAP、ACID、BASE概念

编程 分布式

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