Page 26 - 《软件学报》2024年第6期
P. 26
2602 软件学报 2024 年第 35 卷第 6 期
意味着措施 1 是无用的. 措施 1 可以让措施 3 的静态分析阶段跳过诸多无意义的非 Go 函数, 降低初始化阶段所
带来额外开销, 因此措施 1 也是必不可少的. 为了揭示措施 1 对减少初始化开销的作用, 我们只采用措施 2 和措
施 3, 不采用措施 1 去重复第 4.2.2 节中的测试, 结果显示在这 277 个包中, 总初始化时间增加了约 20.14%.
表 1 各个措施误报率测试结果
减少误报的措施 总包数 报错的包数 误报的包数 误报率 (%)
无 277 277 276 99.64
措施1 277 277 276 99.64
措施2 277 277 276 99.64
措施1+措施2 277 24 23 95.83
措施3 277 274 273 99.63
措施3+措施1 277 274 273 99.63
措施3+措施2 277 1 0 0.00
措施3+措施1+措施2 277 1 0 0.00
4.4 开源项目测试
为了了解真实世界 Go 项目中是否有违反 Go 逃逸不变式引发的内存安全问题, 我们选取了 18 个在各个领域
具有代表性的 Go 开源项目来进行测试, 这些开源项目涉及 Web、数据库、分布式系统、边缘计算、云存储等多
个领域. 选取的仓库如表 2 所示. 测试时使用和第 4.1 节相似的测试方法: 以包为单位, 将这些项目提供的测试用
例和 Benchmark 编译成可执行文件, 并随后使用 DBI-Go 进行检测. 在这 18 个开源仓库中共有 1 730 个包提供了
测试用例或者 Benchmark. 最后的测试结果显示, DBI-Go 在这些仓库中并未检测到问题.
表 2 测试的代表性 Go 开源项目
类型 仓库名 简介 可测试的包数
hugo 轻量 Web 框架 123
beego Go 语言 Web 框架 54
Web
go-restful 用 Go 构建的 REST 风格的 Web 服务包 1
websocket WebSocket 协议的 Go 实现 1
代理 v2ray-core 网络代理工具 64
dgraph 分布式的、可扩展的图数据库管理系统 84
数据库
etcd 分布式键值数据库 93
cli GitHub 官方命令行工具 170
git服务
gogs 自托管 Git 服务 24
边缘计算 kubeedge Kubernetes 原生边缘计算框架 66
open-local 云原生本地存储管理系统 9
存储管理
rclone 云存储管理 133
依赖注入框架 IOC-golang 依赖注入框架, 便于搭建任何 Go 应用 55
protobuf-go Google 数据交换格式 43
序列化
json-iterator/go encoding/json 包的高性能替代 10
分布式 grpc-go gRPC 的 Go 语言实现 108
容器管理 kubernetes 生产级容器调度和管理 680
日志管理 zap 快速、结构化、分级的日志 12
合计 1 730
4.5 适用性测试
上述测试中针对额外运行时开销、Go 标准库以及编译工具链的测试中所使用的 Go 编译器为当前的最新版