Page 246 - 《软件学报》2026年第3期
P. 246
李清伟 等: Go 语言程序的内存性能与安全问题实证研究 1209
出现在开发工具、容器/虚拟机、数据库存储等领域, gn 上述代表性仓库的领域分布结论基本保持一致. 因此, 开
发工具、云/微服务、容器/虚拟机和数据库存储类应用更有可能发生 Go 语言内存安全问题.
表 8 含 memory 的 Issues/PRs 数达搜索上限的仓库及领域
仓库名称 仓库Issues数量 领域 仓库名称 仓库Issues数量 领域
cockroach 94 936 Database/Storage cilium 26 402 Networking/Messaging
sourcegraph 58 795 Development tools podman 21 016 Development tools
kubernetes 53 719 Container/VM nomad 20 218 Development tools
tidb 44 191 Database/Storage minikube 15 084 Development tools
istio 39 286 Cloud/Microservices moby 12 510 Container/VM
terraform 34 479 Development tools go-ethereum 10 512 Blockchain
milvus 30 354 Database/Storage kubevirt 9 722 Container/VM
beats 28 684 Cloud/Microservices compose 5 962 Container/VM
rancher 26 911 Development tools - - -
结论 3. 内存泄漏、无效内存地址或空指针解引用两类内存安全问题在 Go 语言中仍然广泛存在, 在 996 个仓
库中, 每个仓库平均包含 12.4 条内存泄漏、18.4 条无效内存地址或空指针解引用的 Issues/PRs, 中位数分别为 4
和 6 条. 相比之下, 悬垂指针问题在 Go 语言中出现的频率较低. 此外, 开发工具、云/微服务、容器/虚拟机以及数
据库存储类应用更容易出现 Go 语言中的内存安全问题.
4.3 内存问题的代码模式
为了总结内存问题在代码中呈现的常见代码模式, 进一步针对 3 类关键词分别人工分析了 50、30、50 条
Issues, 将其归类为不同的问题类型, 分析结果概览见表 9. 在第 4.3.1–4.3.3 节中, 本文将结合实际代码示例, 详细
介绍每类内存安全问题的代码模式, 包含引发问题的代码模式及其相应的修复策略.
表 9 不同关键词人工分析的 Issues 数量
关键词 问题类 Issues 数量
L1: 资源未被显式释放 8
L2: 不正确的显式释放 5
L3: 并发 2
内存泄漏 (LEAK) L4: 依赖项内存泄漏 5
L5: 拷贝大内存 1
L6: 分配和回收速率不匹配 2
非 LEAK 27
N1: 指针使用前没有检查是否为空 10
N2: 某些操作的执行取决于指针是否为nil 1
无效地址或空指针解引用 (NPD) N3: 杂项 10
非 NPD 9
D1: CGO和 unsafe机制 2
D2: 自行实现的垃圾回收机制 14
悬垂指针 (DP)
非 DP 34
合计 130
4.3.1 内存泄漏问题模式
在 7 126 个内存泄漏 Issues/PRs 中, IssueAnalyzer 采样了 50 个 Issues/PRs 进行分析. 在这 50 个 Issues/PRs 中
留下 23 个确定为内存泄漏问题的 Issues/PRs 进行了问题模式的人工分析. 在分析过程中, 本文结合 Issues 中的评
论以及对应修复 PRs 中的修复代码, 总结问题模式, 将这些模式分为如表 9 所示的 L1–L6 这 6 类模式. 各问题模
式的子类以及分布情况如表 10 所示.

