Page 137 - 《软件学报》2025年第4期
P. 137

曹帅 等: 深度学习在基于信息检索的缺陷定位中的应用综述                                                    1543


                 的描述使用    Doc2vec 以句子级编码表征和       word2vec 将缺陷报告的标题编码表征. 缺陷提交信息也是重要的信息
                 来源. Jiang  等人  [42]  提出的  DBL  使用了缺陷提交作为输入, 通过   sen2vec 对缺陷的提交进行编码表征. 同时将缺陷
                 报告作为额外输入, 通过       word2vec 对缺陷报告进行编码表征. 接着将两者向量链接进行后续的特征提取.

                 4.1.2    代码编码方式
                    经过预处理的源文件包含类名、函数名、注释、标识符等信息, 可以与缺陷报告一样作为文本, 直接使用与
                 缺陷报告相同的方法进行编码表征. 如            Lam  等人  [14]  提出的  HyLoc 直接源文件中的类名、函数名、标识符、注释、
                 API 描述信息以及包含缺陷修复频率等其他信息检索信息的元数据进行编码表征.
                    与缺陷报告不同的是, 只将源文件作为文本信息直接进行编码表征会丢失程序语言中的结构信息, 如函数间
                 的依赖信息等. 为了保留这些结构信息, 在许多缺陷定位方法中会将源文件转换成抽象语法树、控制流图等图谱,
                 以图的方式进行编码表征. 这些方法通常通过树与图的方式将源文件分为类名、方法名、变量名, 在将代码转换
                 成图或树会排除代码注释的内容. 但也有方法不仅对转换为图或树的代码进行编码表征, 也对源文件的文本信息
                 进行编码表征. 如     Liang  等人  [35]  提出了定制抽象语法树  CAST, 改进了原始的抽象语法树. 将原始          AST  中的  92  种
                 句法实体删去对缺陷定位无用的实体种类, 减少到                54  种, 去除了原始   AST  中包含的大量冗余不相关的特征, 利用
                    另外, 还可以将信息检索的特征一同编码表征. Yang
                 简洁高效的源代码文件的结构和语义信息. 随后特殊的                  AST  可以得到一个更加精炼的抽象语法树并建立了一个
                 54  词的词汇表, 通过   word2vec 对精炼的抽象语法树和源文件文本信息都进行编码表征进行后续的源代码特征
                 处理.
                    对控制流图     CFG  的编码表征也是使得代码结构信息保存的一种编码表征处理方式. Huo                     等人  [39]  在  LS-CNN
                 的基础上选择了控制流图提取反映程序的结构和功能性质的语义特征, 提出了                          CG-CNN. 程序语句的语义不仅与
                 它的标记相关, 也与源代码同一执行路径中的相邻语句相关. 在                    CG-CNN  中源代码的每个语句在        CFG  中被表示
                 为一个节点, 通过     DeepWalk  表示了源文件中分支和循环等结构信息.
                    Ma 等人  [56] 提出的  MLA  也将控制流图进行编码表征. 通过高级抽象来处理缺陷报告中高级描述难以与控制
                 流图匹配的问题, 通过不断将相应的简单语句形成一个紧凑的复合语句, 将控制流图不断抽象到一个更高的层次,
                 直到顶层只剩下一个节点. 弥补缺陷报告中对意外行为的高层次描述与控制流图中的低层次实现细节之间的巨大
                 语义差距完成缺陷定位. 最后通过          word2vec 将抽象处理的控制流图进行编码表征.
                    Zhu  等人  [59] 提出的  Bloco  是一个基于图神经网络的缺陷定位方法. Bloco       为代码编码表征设计了一个分层网
                 络  Code-NoN, 他整合了  CFG  和  AST  结构所提供的互补性知识. 主网络是一个包含许多基本块的                CFG  结构, 每个
                 块的内容是    AST  结构. 因此, Bloco  可以在一个完整的图内, 表示具有很多不同行为的程序, 以此来增加源文件中
                 结构信息.
                    通过将额外信息编码表征的方式, 向基于信息检索的缺陷定位方法加入一些特征, 有助于模型后续的定位工
                 作. 比如知识图谱是一个由节点和有向边组成的图, 用来表示领域知识. 在软件知识图中, 节点代表软件知识实体
                 (如类、问题报告和业务概念), 有向边代表这些实体之间的各种关系                     (如方法调用和可追溯性链接).
                    Zhang  等人  [43]  提出  KGBugLocator. 利用知识图谱编码表征来提取源代码内部的结构和逻辑. 将知识图谱中的
                 知识限定为代码知识, 其中节点代表代码实体              (如类、方法和属性), 边代表代码实体之间的关系               (如方法调用和类
                 声明) 然后, 利用在问题-提交链接恢复中显示出的              TransR、TransE  和  TransH  的技术, 将代码知识图谱作为额外
                 信息编码表征.
                                                             等人  [48]  提出的  MRAM  使用代码修订图, 包含仓库、缺
                 陷报告、提交、文件和方法这           5  个实体之间的联系. 其中文件和方法有一个修订属性, 可以扩展短的方法内容, 缓
                 解稀疏性的问题, 提高定位性能. 根据代码修订图谱可以计算修订的协同过滤得分                         rcfs, 缺陷修复时间得分     bfrs, 缺
                 陷修复频率分数      bffs 以便后续的缺陷定位.

                 4.2   特征提取方案
                    使用深度学习的基于信息检索的缺陷定位方法的特征提取层往往是其核心所在. 深度模型的作用主要是为了
   132   133   134   135   136   137   138   139   140   141   142