一句话:提出 GCatch 与 GFix,自动检测并修复 Go 中因 channel 误用导致的阻塞型并发缺陷。
Go 语言鼓励使用轻量级 goroutine 和 channel 进行并发编程,但实证研究表明,channel 误用引发的并发缺陷在 Go 生态中广泛存在,严重损害系统可靠性。针对这类缺陷,本文提出静态检测系统 GCatch 与自动修复系统 GFix。GCatch 先对输入的 Go 程序进行解缠,再用一种新颖的约束系统对复杂的 channel 操作建模,并调用约束求解器识别阻塞型缺陷;GFix 则利用 Go 中与 channel 相关的语言特性,为 GCatch 检测出的阻塞缺陷自动生成补丁。作者将二者应用于 21 个流行 Go 应用,包括 Docker、Kubernetes 和 gRPC 等,共发现 149 个此前未知的 channel 误用阻塞缺陷,GFix 成功修复其中 124 个;开发者已基于报告修复 125 个缺陷,其中 87 个直接采用了 GFix 生成的补丁。
Go is a statically typed programming language designed for efficient and reliable concurrent programming. For this purpose, Go provides lightweight goroutines and recommends passing messages using channels as a less error-prone means of thread communication. Go has become increasingly popular in recent years and has been adopted to build many important infrastructure software systems. However, a recent empirical study shows that concurrency bugs, especially those due to misuse of channels, exist widely in Go. These bugs severely hurt the reliability of Go concurrent systems. To fight Go concurrency bugs caused by misuse of channels, this paper proposes a static concurrency bug detection system, GCatch, and an automated concurrency bug fixing system, GFix. After disentangling an input Go program, GCatch models the complex channel operations in Go using a novel constraint system and applies a constraint solver to identify blocking bugs. GFix automatically patches blocking bugs detected by GCatch using Go’s channel-related language features. We apply GCatch and GFix to 21 popular Go applications, including Docker, Kubernetes, and gRPC. In total, GCatch finds 149 previously unknown blocking bugs due to misuse of channels and GFix successfully fixes 124 of them. We have reported all detected bugs and generated patches to developers. So far, developers have fixed 125 blocking misuse-of-channel bugs based on our reporting. Among them, 87 bugs are fixed by applying GFix’s patches directly.
DOI 原文 ·
@inproceedings{paperbot6094,
title = {Automatically detecting and fixing concurrency bugs in go software systems},
author = {Ziheng Liu and Shuofei Zhu and Boqin Qin and Hao Chen and Linhai Song},
booktitle = {ASPLOS},
year = {2021},
doi = {10.1145/3445814.3446756}
}