Page 220 - 《软件学报》2026年第5期
P. 220

刘浩 等: 基于图   Transformer 的变更集错误定位方法                                              2099


                    根据图   7  显示, 当相关性判断阈值      k 较小时, 本文提出的错误定位方法的实验结果表现显著较差. 随着                   k 值的
                 增加, MRR  和  MAP  这两个指标逐步上升. 这是由于更高的阈值使得更多的不相关代码被排除, 从而提高了实验结
                 果的准确性. 然而, 当     k 值超过  0.35  并持续增大时, 相关代码可能被误判为不相关代码, 这会导致训练模型包含更
                 多的无关更改, 从而降低实际匹配代码的得分. 随着不相关代码比例的增加, 这种误判对最终的错误定位结果的准
                 确性产生负面影响. 图中后半部分显示了             MAP  和  MRR  值的缓慢下降趋势, 进一步证实了这一点.
                    此外, 从实验结果中可以观察到, 当使用较小的模型层数                  (L=6) 和隐藏状态维度    (d=256) 时, 本文所用错误定
                 位方法的表现显著不佳. 相反, 使用较大的模型层数               (L=12) 和隐藏状态维度     (d=512) 时, 实验效果显著提升. 这一
                 现象可以归因于以下几个因素: 首先, 较大的模型层数                 L  增加了模型的深度, 使其能够逐层抽象出输入数据的特
                 征, 捕捉到更加复杂和高级的图结构特征. 在图结构数据中, 深层模型有助于学习节点间更细致和深层次的关系.
                 其次, 增加隐藏状态维度       d  为模型提供了更大的表示空间, 使其能够编码更多的信息, 提升了模型区分图结构和节
                 点属性的能力. 这种高维的表示有助于模型在处理复杂图数据时提高精度和泛化能力.
                    然而, 需要指出的是, 较大的模型层数           (L=12) 和隐藏状态维度     (d=768) 也可能导致训练和计算开销的显著增
                 加. 过大的计算开销可能迫使我们减少训练批次大小, 从而导致                   L=12  和  d=768  组合下的训练效果不如预期. 因此,
                 综合考虑模型的性能与计算资源的平衡, 本文选择了                 L=12, d=512  和  k=0.35  作为最终的训练配置.
                  4   相关工作

                  4.1   基于图的代码表示

                    程序语言相较于自然语言, 其结构性与层次性更为明显. 这种特性使得基于图的代码表示学习方法在捕捉代
                 码复杂结构和语义信息方面具有显著优势. 基于图的代码表示具有抽象语法树、控制流和数据流等多种维度的表
                 示模式, 这些信息在错误定位过程中发挥了关键作用, 能够提高错误定位的精确性和效率. code2vec                         [35] 通过抽取并
                 编码抽象语法树中的路径, 捕捉代码的结构和语义, 但其并没有表征变更代码的变化信息. Li 等人                            [36] 提出了基于
                 卷积神经网络的      DP-CNN  模型, 该模型针对文件级错误检测, 并将抽象语法树作为代码原始表征以获取更多的结
                 构信息, 但错误检测粒度仅在文件级别. Ma 等人             [37] 采用了一种特别设计的结构引导注意力来全局捕获控制流图
                 中的信息, 以便更好地从控制流图中提取特征, 但没有综合考虑局部信息. Du                      等人  [7] 提出了语义流图    (SFG) 来捕
                 捉代码语义, 并进一步提出了         SemanticCodeBERT, 用于学习考虑深层代码结构的代码表示. 还有许多工作                [38−40] 将
                 多种维度的表示模式结合, 使用多重融合图表示代码结构. 例如, Wang                   等人  [41] 提出了  FUNDED, 它在抽象语法树
                 的基础上, 人工定义了       8  种关系, 以将抽象语法树扩增为一个有向多图. 然而, 尽管多重融合图表示代码结构能够
                 显式表征更多维度的代码特征, 但这种方法也存在一些问题. 例如, 相同的节点往往会被合并, 导致部分信息丢失;
                 代码语言的自然顺序也会受到影响; 同时, 还可能增加无关的冗余节点, 对模型的性能产生负面影响.
                    为了克服这些问题, 本文构建了基于变更的抽象语法树, 旨在更有效地表征代码的结构信息, 特别是显式表征
                 变更节点, 从而学习错误定位中变更集代码的变更信息. 通过关注代码变更部分, 我们能够更准确地捕捉与错误相
                 关的特征, 提高错误定位的精确性和效率.
                  4.2   面向变更集的错误定位研究
                    面向变更集的错误定位是根据软件项目的历史版本信息和错误跟踪器中的错误报告, 通过分析相关的代码变
                 更, 找出最初引入错误的变更集的过程            [42] . 这个过程的主要目标是快速且准确地定位导致错误出现的具体代码变
                 更, 以便开发者能够有效地修复问题. 在版本控制系统                (version control system, VCS) 中, 每次提交  (commit) 通常包
                 含更改前和更改后的代码快照. 这种表示方式使得开发者能够清晰地理解代码的增量和变更历史, 从而更容易地
                 追踪和定位错误.
                                                   [5]
                    在基于变更集的错误定位研究中, Locus 是第            1 个在基于   IR  的错误定位技术中利用代码变更块           (code change
                                                    [8]
                 hunk) 创建文本语料库的研究者. Bug2Commit 模型通过构建基于图的神经网络来对代码提交与错误报告进行匹
                 配. 它将错误报告和代码提交映射到一个共享的嵌入空间中, 并利用图神经网络                         (GNN) 来捕捉错误报告与代码提
   215   216   217   218   219   220   221   222   223   224   225