Golang (also known as Go for short) has become popular in building concurrency programs in distributed systems. As the unique features, Go employs lightweight Goroutines to support highly parallelism in user space. Moreover, Go leverages channels to enable explicit communication among threads. However, recent studies show that concurrency bugs are not uncommon in Go applications. Pinpointing these concurrency bugs in real Go applications is both important and challenging. Existing approaches are mostly based on compiler-aided static or dynamic analysis, which have two limitations. First, existing approaches require the availability and recompilation of the source code, which work well on testing rather than production environments with no source code available for both applications and external libraries. Second, existing approaches work on pure Go code bases only, not programs mixed with Go and other languages. To address these limitations, we develop BINGO, the first tool to identify concurrency bugs in Go applications via dynamic binary analysis. BINGO correlates binary execution with Go semantics and employs novel bug detection algorithms. BINGO is an end-to-end tool that is ready for deployment in the production environment with no modification on source code, compilers, and runtimes in the Go eco-system. Our experiments show that BINGO has a high coverage of concurrency bugs with no false positives. We are able to use BINGO to identify concurrency bugs in real applications with moderate overhead.
翻译:戈兰格(也称为短短Go)在建立分布式系统中的货币方案时已变得受欢迎。 作为独特的特征, Go 使用轻量的戈鲁蒂内斯支持用户空间的高度平行化。 此外, Go 利用渠道使线条之间能够进行明确沟通。 但是, 最近的研究显示, Go 应用程序中共通错误并不罕见。 在真实的 Go 应用程序中点出这些共通货币错误既重要又具有挑战性。 现有办法主要基于编译者协助的静态或动态分析,这有两个限制。 首先, 现有办法需要源码的可用性和再校正化, 而源码是测试而不是生产环境的极佳功能。 其次, 现有办法只用于纯go 代码基础,而不是与 Go 和其他语言混合的程序。 为了克服这些限制, 我们开发了BINGO, 这是通过动态的二进制分析在Go 应用程序中找出共通货币错误的第一个工具。 BINGO 和新错误检测算算法的终端端至端工具, 正在准备在生产周期内部署一个真正的Oudioal 。