Page 240 - 《软件学报》2026年第3期
P. 240

李清伟 等: Go  语言程序的内存性能与安全问题实证研究                                                   1203


                 法树 (AST)、控制流图 (CFG)、数据流图 (DFG)、调用图 (CG) 以及类型信息, 并将其存储到关系数据库中. 通过
                 数据库查询语言      QL [32] , 可以编写匹配特定代码模式的查询语句, 从数据库中查询相关模式实例及其信息. 借助
                 CodeQL, QLStat 工具能够支持包括     Go  语言在内的多种语言的批量仓库的模式统计分析, 为编译器优化提供数据
                 支撑和决策依据.

                                                                      QLStat
                                                                                                Pattern
                                                                    pattern statistic
                                                                                               distribution
                                                                                                 RQ1
                           Repos                                      QL
                          updated in                                Pattern
                           last year  996                           query                     Bug reports
                                    Repos           Issue statistic                              RQ3
                                                 Issue pattern analysis  Issue-pattern: ...
                                                                                            Issue/Repo domain
                                                                                             fix time/fix scale
                                                                                               distribution
                                                                                                 RQ2
                                                  图 2 PatStat 框架整体设计



                                                                             expr  Loc
                                                                 *ptr        *p1  /path. go
                                                                             x. f  ...
                              Database create
                                                                                            Merge
                     996                                                     addr  Loc
                    Repos                                       & object     & i  ...
                                   QL                                       & r [i]  ...          Pattern
                                                                                                 distribution
                                           966
                                         Databases                ···
                                                                                ···
                                             图 3 访存操作的模式统计工具 QLStat

                    QLStat 通过以下步骤来对代码仓库中的访存操作模式进行匹配与分析.
                    ● 生成数据库. QLStat 首先对收集的       996  个代码仓库进行分析, 成功生成了        966  个数据库.
                    ● 基于数据库统计访存操作模式. 在生成数据库后, QLStat 基于               AST  使用模式匹配查询语句, 统计不同基本
                 访存操作的实例分布. 例如针对取地址访存操作              (&object), QLStat 的查询语句是相应的   from AddressExpr...select...
                 语句. 在某个仓库的查询结果出现了&i 和&r[i] 这两个实例, 表明在该代码仓库中存在两个取地址访存操作实例.
                    ● 结果合并与分析. QLStat 将所有数据库的查询结果合并, 生成不同基本访存操作的全局分布数据. 这些分布
                 数据为编译器优化提供了重要参考, 帮助开发者识别程序中频繁的访存操作, 从而制定针对性的优化策略, 提高程
                 序性能.
                  2.2   RQ2: 内存安全问题分析
                    为了回答    RQ2, 设计了如图    4  所示的  IssueAnalyzer 工具, 以帮助分析常见内存问题在        Go  语言中的存在性、
                 分布、项目领域分布以及内存问题的模式特征.
                    ● Issues/PRs 获取与分析. IssueAnalyzer 首先对  996  个仓库进行搜索, 获取过去    5  年内更新的   Issues/PRs. 选择
                 较新的   Issues/PRs 是为了更准确地反映当前      Go 语言项目中的实际问题. 在搜索过程中, IssueAnalyzer 聚焦于标题、
                 正文和评论中包含特定关键词的内容, 从而构建和关键词相关的                     Issues/PRs 集合.
                    在获得   Issues/PRs 的集合之后, IssueAnalyzer 从宏观和微观两个层面进行分析. 宏观上, IssueAnalyzer 对不同
                 关键词搜索到的      Issues/PRs 在各个仓库中的分布进行了统计分析, 探讨哪些内存问题在                 Go  语言项目中更为常见,
                 更易发生. 另外, IssueAnalyzer 还分析包含这些     Issues/PRs 的项目的领域, 了解哪些领域的项目更容易受到内存问
   235   236   237   238   239   240   241   242   243   244   245