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  所示.
   241   242   243   244   245   246   247   248   249   250   251