🤖 AI Summary
This work addresses the challenge of detecting deadlocks in Go programs arising from complex, multi-stage channel interactions, which existing static analysis tools struggle to identify effectively. The authors propose an extended coroutine type system integrated with a flow mechanism that, for the first time, enables precise modeling of goroutine behaviors involving multiple send and receive operations. By combining type reduction rules with the Z3 SMT solver, the approach delivers an accurate static analysis of unbuffered channel semantics. It successfully detects 17 distinct classes of intricate deadlock patterns—including send/receive mismatches and nested goroutines—with high precision even in scenarios where current tools fail. This method fills a critical gap in value-based static deadlock detection for Go.
📝 Abstract
Coroutines, as an abstract programming construct, are a generalization of functions that can suspend execution part- way for later resumption. Coroutine Types are behavioral types to model interactions of coroutines with a single receiving operation followed by a single yielding operation. Coroutine Types have been applied to model-driven engineering, smart contracts, and test case generation. We contribute a Flow extension to Coroutine Types, so that coroutines with more than one receiving and yielding operation can be modeled. We accordingly revise the reduction rules of Coroutine Types. To show the usefulness of the Flow extension, we contribute a type system that maps expressions of the Go programming language to Coroutine Types. If the reduction result is 0, the two channel operations are paired properly and the program has no deadlocks. We choose Go because it is a popular programming language for distributed systems, but a frequent kind of bugs in Go is deadlocks due to the wrong use of concurrency features. We concentrate on the most commonly used semantics in Go: unbuffered channels with the keywords go and defer. Our Flow extension and the type system recognize 17 patterns of channels and goroutine interactions, including mismatched receivers and senders, nested goroutines, etc. We also integrate the Z3 SMT solver to take account of conditional execution and type inheritance. Other static or dynamic deadlock detectors crashed or gave wrong predictions in some patterns. Therefore, our type-based deadlock analyzer not only fills the gap in the landscape of value-based detection, but also complements existing detectors.