Page 245 - 《软件学报》2026年第3期
P. 245
1208 软件学报 2026 年第 37 卷第 3 期
同关键词的 Issues/PRs 数量分布, 如表 6 所示. 从数量上看, 包含 LEAK 和 NPD 的 Issues/PRs 数量较多, 分别为
7 126、13 007 条; 这两个关键词涉及的仓库数量也较多, 分别为 573 和 708 个. 表 6 中 avg 至 max 列以每个仓库
所包含的 Issues/PRs 数量为单元, avg 列为仓库包含 Issues/PRs 数量的平均值, min 至 max 列给出以 25% 为间隔
的分位数. 数据显示, 75% 的仓库至多只有 2 个可能为悬垂指针问题 (DP). 而同样比例的仓库中, 至多有 10 条内
存泄漏问题 (LEAK) 和 16 条空指针解引用问题 (NPD), 表明内存泄漏和空指针解引用问题更为常见. 因此, 可以
认为内存泄漏和空指针解引用问题在 Go 语言中仍然存在, 而悬垂指针问题在 Go 语言中较少.
表 6 搜索不同关键词得到的 Issues/PRs 数量与分布信息
关键词 (内存安全问题) Issues/PRs 数量 仓库数量 avg min 25% 50% 75% max
memory leak (LEAK) 7 126 573 12.4 1 2 4 10 540
invalid memory address OR nil pointer (NPD) 13 007 708 18.4 1 2 6 16 1 000
dangling pointer (DP) 203 91 2.2 1 1 1 2 19
4.2.2 内存安全问题与代码仓库所属领域的关系
为了理解内存安全问题与代码仓库所属领域之间的关系, 本文进一步收集通过 memory 关键词搜索得到的
83 850 条 Issues/PRs 关联的仓库所在的领域. 在 996 个仓库中, 有 185 个仓库的 Issues/PRs 数量占总量的 80%, 剩
余的大部分仓库只占不足 20%. 因此, 本文选取这 185 个仓库作为更具有代表性的仓库来进行分析.
在对仓库进行领域分析时, 本文使用了 Costa 等人 [41] 提供的标注数据集, 该数据集用于反映使用 unsafe
package 的仓库领域信息. 对于不在该数据集中出现的仓库, 本文根据数据集中的领域标签进行标注. 仓库领域
的统计结果如表 7 所示. 结果显示: 开发工具、云/微服务、容器/虚拟机等领域的仓库存在相对较多的内存相关
问题. 其中, 开发工具类仓库占比最高, 这可能与 Go 在 CI/CD 工具、CLI 命令行工具等开发场景中的广泛应用
有关. 对于云/微服务、容器/虚拟机两种类型的仓库, 由于它们通常需要占用更多的内存资源, 内存相关问题也
更为显著.
表 7 内存安全问题代表性仓库领域统计
仓库领域 仓库数量 占比 (%)
Development tools 46 24.86
Cloud/Microservices 38 20.54
Container/VM 21 11.35
Database/Storage 17 9.19
Networking/Messaging 15 8.11
Monitoring 13 7.03
Security 9 4.86
OS/File system 5 2.70
Web 5 2.70
Blockchain 4 2.16
Misc 3 1.62
Programming language support 3 1.62
UI 3 1.62
Compiler 1 0.54
ML/Scientific library 1 0.54
Multimedia 1 0.54
总计 185 -
由于 GitHub API 的限制, 每次搜索最多只能返回 1 000 条 Issues/PRs [42] . 这意味着通过 memory 关键词搜索得
到的结果并非全集, 会影响上述结论的有效性. 然而, 进一步分析显示, 只有 17 个仓库的 Issues/PRs 数量达到了上
限, 这些仓库更能代表内存安全问题在 Go 语言中的现状. 表 8 显示了这 17 个仓库的领域分析结果, 它们更多地

