Page 208 - 《软件学报》2026年第5期
P. 208
刘浩 等: 基于图 Transformer 的变更集错误定位方法 2087
或“–”, 用以区分新增与删除的内容, 而未更改的代码保持不变且仅显示一次. 代码变更块包含一组连续的变更行,
同时还包括上下文未发生变化的相关代码行. 值得注意的是, 开发者提交的更改可能涉及多个文件, 每个文件中的
修改可以位于一个或多个位置, 每个位置称为一个块或增量. 基于变更提交这种特殊形式, 本文将每个代码块抽象
为一个抽象语法树, 旨在捕捉并结构化地展现变更代码块的结构信息, 每个变更的 AST 节点对应于代码的一个语
法构造或组成部分 (如操作符、变量、函数调用等). 该语法树能够清晰地描绘代码的语法结构, 其中每个节点对
应于代码的一个语法构造或组成部分, 比如操作符、变量、函数调用等. 代码的变更信息通过抽象语法树节点的
变化直观体现. 这种节点级别的变化能够准确反映代码修改的具体内容和位置, 从而为代码变更的分析和理解提
供了清晰的视角.
如图 1 所示为代码变更的一个示例, 其中包含删除代码行 (以红色高亮显示)、新增代码行 (以绿色高亮显示)
以及未更改代码行. 为了分析这些代码变更, 我们利用基于变更的抽象语法树, 图 2 直观展示了变更前后抽象语法
树的对比情况, 图 2(a) 的树表示代码变更前的状态, 其中删除的代码行所对应的节点以红色标出; 图 2(b) 的树则
反映变更后的代码结构, 新增代码行的节点以绿色节点标出. 未更改的代码则对应于灰色的节点. 基于变更的抽象
语法树突出显示了变化的节点, 提供了代码结构层面的详细变更信息. 同时, 基于变更的抽象语法树, 可以从全局
角度获得其整体表示, 而在局部专注其变化的节点. 将局部信息和全局信息结合起来, 我们可以获得更全面的视
角, 从而更准确地定位错误. 利用局部信息确定变化点, 局部的变更代码让我们把注意力聚焦到第 7 行的 update-
BundleDescription(model) 语句和第 8 行的 return oldId 语句. 结合全局信息, 可以查看包含这个返回语句的类和方
法的定义, 了解它们的用途和调用关系.
−
图 1 代码变更块实例
CompilationUnit CompilationUnit
TypeDeclaration: class TypeDeclaration: class
PluginModel … MethodDeclaration PluginModel … MethodDeclaration
Manager Manager
Block private Void Block private Void updateTable
updateTable
Block MethodInvocation Block ReturnStatement
Flag: del Flag: add
MethodInvocation MethodInvocation
model
MethodInvocation updateBundleDescription Flag: del oldId
Flag: del MethodInvocation Flag: add
getEntryTable put newId newEntry getEntryTable put newId newEntry
PluginModelDelta. PluginModelDelta.
delta addEntry newEntry ADDED delta addEntry newEntry ADDED
(a) 变更前代码结构示例 (b) 变更后代码结构示例
图 2 变更的抽象语法树
通过比较变更前后的抽象语法树, 我们可以深入分析代码变更的具体影响: 分析被删除节点的功能和作用, 可
以帮助判断这些删除是否会引发功能缺失或错误. 分析新增代码节点是否满足需求并实现了预期的功能, 同时不

