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  个仓库的领域分析结果, 它们更多地
   240   241   242   243   244   245   246   247   248   249   250