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

刘书宁 等: 基于代码变更语义分析的缺陷隔离方法                                                        2163


                 使得缺陷隔离的准确性降低. 禁用上下文收集器时, 决策模型无法获取完整的代码上下文信息, 导致模型对代码变
                 更的理解缺乏背景支持, 由于上下文信息不足, 某些变更可能被错误合并或拆分, 影响隔离效果. 禁用评估消息生
                 成器时, 缺乏对拆分结果的动态评估和优化过程. 由于提交日志未经过语义分析, 包含多个开发活动的子提交集合
                 无法被进一步拆分或优化, 这导致了生成的子集更为冗余和粗糙, 对缺陷隔离的精确度和子集的粒度都造成不利
                 影响.

                            表 5 在  Defects4J 数据集上增量调试方法与       DISAC  方法的实验结果    (共  809  条数据)

                             低位区间 (1–4)  次低区间 (5–8)   次高区间 (9–12) 高位区间 (13–16) 离群值区间 (17+)     全部数据
                               共419条        共161条        共85条         共63条         共81条
                    方法
                             #成功  约减率    #成功   约减率    #成功   约减率    #成功   约减率    #成功   约减率    #成功   约减率
                                    (%)         (%)          (%)          (%)          (%)          (%)
                             359   24.19  106   39.52   44   43.22  34    45.16  32   52.87   575  29.88
                 DISAC ¬preprocess
                             387   24.89  137   47.61   59   49.14  45    55.62  47   64.01   675  35.24
                  DISAC ¬context
                             367   24.72  119   41.95   45   46.24  37    47.43  31   50.60   599  31.70
                  DISAC ¬evaluate
                             389   20.03  117   30.93   40   31.77  29    28.51  30   35.63   605  25.28
                   DISAC SC
                   DISAC LLM  301  21.15   81   33.84   36   39.62  23    41.20  18   47.06   459  26.55

                           表 6 在回归缺陷数据集上增量调试方法与               DISAC  方法的实验结果     (共  1 025  条数据)

                           低位区间 (1–46) 次低区间 (47–92) 次高区间 (93–138) 高位区间 (139–176) 离群值区间 (177+)   全部数据
                              共643条        共142条        共67条          共51条          共123条
                    方法
                            #成功  约减率    #成功   约减率    #成功   约减率     #成功 约减率 (%)   #成功   约减率    #成功  约减率
                                  (%)          (%)          (%)                          (%)        (%)
                 DISAC ¬preprocess  451  37.35  63  38.44  30  27.71  17  22.30   25    14.26  586  33.81
                             485  39.38  76    41.10  43    31.62   24    24.46   38    18.02  666  36.53
                  DISAC ¬context
                 DISAC ¬evaluate  446  37.15  69  39.14  27  27.20  15    20.11   21    11.41  578  32.65
                             435  23.25  51    10.13   6    5.12    13    17.01    4    2.57   564  19.02
                   DISAC SC
                             384  30.25  48    34.92  19    25.16   7     16.55    6    10.03  464  27.48
                  DISAC LLM

                    当变更拆解部分整体用         SmartCommit 算法替换时, 成功隔离数量在部分区间上差别不大, 但在约减率上有较
                 大下降, 进一步分析发现, SmartCommit 拆解时仅考虑依赖关系, 未能充分考虑变更之间的语义关系, 导致拆解粒
                 度较大, 其生成的子集通常包含更多代码块, 从而更容易通过编译, 但缺陷隔离的精度和拆分子集的粒度会下降,
                 导致约减率有较大下降, 降低缺陷隔离结果的准确性. 当变更拆解部分只使用大语言模型时, 成功率和约减率上均
                 有所下降, 其中约减率下降幅度相对较小. 这是因为随着变更规模的变大, 大语言模型难以准确建模跨结构或跨模
                 块的依赖关系, 导致相关变更之间的关系被忽略, 影响隔离准确性并降低整体成功率. 但因缺乏依赖关系, 大语言
                 模型拆解的粒度较细, 整体约减率下降幅度较小.
                    以上消融实验表明, 依赖关系分析与大语言模型在代码拆解中具有互补优势, 其协同使用对提升缺陷隔离的
                 效果具有显著作用.
                  4.4   RQ4  实验结果与分析
                    ● RQ4: DISAC  方法与增量调试方法在辅助缺陷根因确定任务中的作用和价值如何?
                    本文设置的用户实验, 旨在验证          DISAC  方法在辅助缺陷根因确定任务上的作用和价值. 实验共招募了                    10  名
                 具有  4  年以上  Java  软件开发经验的研究生, 他们被随机分为           A  组和  B  组. 实验数据为  10  个真实缺陷引入提交
                 (标记为  T1–T10), 覆盖了不同的变更代码块数量区间, 每位参与者需要在已知缺陷隔离结果的基础上, 进一步确定
                 引发缺陷的根本原因并完整描述, 每个任务的完成时间限制为                     20 min  内. 为了确保实验公平性, 实验对缺陷引入
                 提交的隔离算法进行了交叉验证, 具体来说, A               组在任务    T1–T5  中使用  C2D2  算法进行缺陷隔离, 而在任务
                 T6–T10  中使用  DISAC  方法隔离缺陷; B   组则反向安排, 在任务      T1–T5  中使用  DISAC  方法, 在任务  T6–T10  中使
   279   280   281   282   283   284   285   286   287   288   289