Page 9 - 《软件学报》2024年第6期
P. 9
软件学报 ISSN 1000-9825, CODEN RUXUEW E-mail: jos@iscas.ac.cn
Journal of Software,2024,35(6):2585−2607 [doi: 10.13328/j.cnki.jos.007096] http://www.jos.org.cn
©中国科学院软件研究所版权所有. Tel: +86-10-62562563
*
DBI-Go: 动态插桩定位 Go 二进制的非法内存引用
陈金宝, 张 昱, 李清伟, 丁伯尧
(中国科学技术大学 计算机科学与技术学院, 安徽 合肥 230026)
通信作者: 张昱, E-mail: yuzhang@ustc.edu.cn
摘 要: Go 语言, 也称 Golang, 由于其语法简单、原生支持并发、自动内存管理等特性, 近年受到很多开发者的欢
迎. Go 语言期望开发者不必了解变量或对象是分配在栈上还是在堆中, 而由 Go 编译器的逃逸分析来决定分配位
置, 再由 Go 垃圾收集器自动回收无用的堆对象. Go 的逃逸分析必须正确决定对象的分配位置以保证内存状态的
正确性. 然而, 目前 Go 社 区中逃逸相关问题频发, 潜在导致程序崩溃等致命问题, 而目前对该方面的研究缺失. 为
有效检测编译器生成的代码是否存在可能引起运行时崩溃的非法内存引用, 填补研究空白, 对 Go 程序执行进行抽
象建模, 并提出两条判定写入违例的规则. 基于这两条规则, 克服 Go 二进制中高层语义缺失、运行时信息不便获
取等挑战, 设计一个轻量化的分析工具 DBI-Go. DBI-Go 采用静态分析加动态二进制插桩的分析方式, 基于动态二
进制分析框架 Pin 来实现, 可以识别 Go 二进制中违例的 store 指令. 实验结果表明, DBI-Go 可以检测出 Go 社区中
所有已知的逃逸相关 Issues; DBI-Go 还发现一个目前 Go 社区未知的问题, 该问题已经得到确认. 在实际项目上的
应用则表明 DBI-Go 可以帮助开发人员找出逃逸算法的错误. 测试结果还表明 DBI-Go 采取的措施可以有效降低
误报率且在 93.3% 的情况下带来的额外运行时开销小于原先的 2 倍. 同时, DBI-Go 无需修改 Go 的编译运行时, 可
以适配不同版本的 Go, 有较高的适用性.
关键词: 二进制分析; 动态二进制插桩; 静态分析; Go; 编译器测试; 逃逸分析
中图法分类号: TP314
中文引用格式: 陈金宝, 张昱, 李清伟, 丁伯尧. DBI-Go: 动态插桩定位 Go 二进制的非法内存引用 . 软件学报 , 2024, 35(6):
2585–2607. http://www.jos.org.cn/1000-9825/7096.htm
英文引用格式: Chen JB, Zhang Y, Li QW, Ding BY. DBI-Go: Dynamic Binary Instrumentation for Pinpointing Illegal Memory
References in Go Binaries. Ruan Jian Xue Bao/Journal of Software, 2024, 35(6): 2585–2607 (in Chinese). http://www.jos.org.cn/1000-
9825/7096.htm
DBI-Go: Dynamic Binary Instrumentation for Pinpointing Illegal Memory References in Go
Binaries
CHEN Jin-Bao, ZHANG Yu, LI Qing-Wei, DING Bo-Yao
(School of Computer Science and Technology, University of Science and Technology of China, Hefei 230026, China)
Abstract: The Go programming language, also known as Golang, has become popular with developers in recent years due to its simple
syntax, native support for concurrency, and automatic memory management. This language expects that developers do not need to know
whether variables or objects are allocated on the stack or in the heap. The escape analysis of the Go compiler determines the allocation
location, and then the garbage collector automatically recycles unreachable heap objects. Go’s escape analysis must correctly determine the
allocation location of the object to ensure the memory state correctness. However, escape analysis related problems frequently occur in the
Go community at present, potentially causing fatal problems such as program crashes, and there is currently a lack of research on this
* 基金项目: 国家自然科学基金 (62272434)
本文由“编译技术与编译器设计”专题特约编辑冯晓兵研究员、郝丹教授、高耀清博士、左志强副教授推荐.
收稿时间: 2023-09-10; 修改时间: 2023-10-30; 采用时间: 2023-12-14; jos 在线出版时间: 2024-01-05
CNKI 网络首发时间: 2024-03-23