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

香佳宏 等: 大模型在软件缺陷检测与修复的应用发展综述                                                     1513


                 对缺陷代码进行变异, 并使用相关测试用例来评估新的变异程序的适应度, 其中具有高适应度的个体将被选中进
                 行持续的进化, 直到生成保留程序功能且没有漏洞的程序补丁. 实验成果表明, GenProg                       有效地解决了     16  个  C  程
                 序中的错误, 涵盖了      8  种缺陷类型, 如死循环、段错误、缓冲区溢出等. 这验证了                GenProg  在实际运用中的效能,
                 进而激发了大批科研人员对自动修复领域的研究兴趣.
                    Wen  等人  [175] 发现, 可疑代码的上下文信息能够隐含地表示修复漏洞的可能性. 基于这一发现, 他们提出了一
                 种基于上下文的缺陷自动修复技术            CapGen. 该技术利用开源项目中大量真实漏洞补丁的上下文信息, 解决基于启
                 发式搜索的自动程序修复技术中的搜索空间爆炸问题. 在                  Defects4J 缺陷数据集上, CapGen  为  21  个漏洞成功生成
                 补丁, 并且准确率达到      84%. 但是由于   GapGen 对搜索空间的高度约束, 导致可修复的漏洞数量和范围比较局限.
                    在过去的自动修复工具中, 针对          Java 语言的自动修复工具往往从源码级别对程序进行修复, 需要反复编译程
                 序导致时间开销过高, 因此于         2019  年  Ghanbari 等人提出  PraPR [172] 技术尝试解决这一挑战. PraPR  在  Java 虚拟机
                 (JVM) 字节码级别进行操作, 采用了一系列简单的字节码突变规则. 为了进一步提升修复效率, PraPR                         产生的所有
                 补丁都可以无需编译直接进行验证. 相比于过去需要编译和加载每个候选补丁的技术, 在效率上具有显著的优势.
                 实验评估表明, PraPR   可以明显提高修复漏洞的数量和效率. 然而由于                PraPR  在  Java 字节码上进行修复, 部分程序
                 在实验中, PAR
                 语义信息在修改编辑过程中丢失, 导致其漏洞修复能力受限.

                 5.2.2    基于约束的缺陷自动修复技术
                    基于约束的缺陷自动修复技术通过约束求解和程序合成生成修复代码. 在                         2013  年, Nguyen  等人提出  SemFix
                 工具  [176] , 这个技术包含  3  个部分: (1) 应用  Tarantula 缺陷定位方法  [177] 计算出语句缺陷概率, 即尝试定位缺陷位置;
                 (2) 语句级约束推理, 即使用符号执行技术自动发现错误语句的约束; (3) 程序合成, 即使用程序合成思想合成符合
                 约束的语句. 在    Defects4J 数据集的实验结果中, SemFix    成功修复了    13  个漏洞.
                                                       [7]
                    DeMarco  等人提出缺陷自动修复工具         Nopol . 该工具主要针对两类错误模型: 错误的            If 条件和程序前置条
                 件缺失   (即某个方法或函数在执行之前需要满足的某些条件缺失), 这两类错误都属于程序条件错误的范畴, 且在
                 实际应用中非常常见. Nopol 将包含至少一个失败测试案例的程序和其相关测试作为输入, 通过逐个分析失败测
                 试案例执行的语句, 尝试找到可能存在修复方案的语句. 在找到可能的修复位置后, Nopol 通过代码插桩从相关测
                 试执行中收集信息, 然后将这些运行时信息转化为可满足性模块理论                       (SMT) 问题, 如果存在解决方案, SMT       求解
                 器便生成源代码补丁.
                        [8]
                    JAID 是一种基于程序约束的自动修复技术, 旨在解决基于有限测试集的自动化程序修复容易过拟合的问
                 题. JAID  的操作机制类似于先前基于约束的修复技术, 但并不依赖于用户编写的约束条件, 而是通过分析目标缺
                 陷状态建立大量约束, 从而进行修复补丁的生成和验证. 其中, JAID                 主要依赖无副作用的函数来描述状态, 并采用
                 缺陷定位和启发式的排序方法来识别可能与故障行为有关的程序状态, 从而减少需要生成和验证的补丁的数量.
                 实验结果表明, 在     Defects4J 缺陷数据集中, JAID  生成了   31  个可信补丁以及    25  个与程序员编写的修复方案相近
                 的正确修复.

                 5.2.3    基于模板的缺陷自动修复技术
                    基于模板的缺陷自动修复工具使用开发者或者研究人员根据经验预定义的一些修复模板或者修复策略以修
                 复特定类型的缺陷. 2013     年  Kim  等人提出了基于模板的缺陷自动修复工具              PAR [11] , 该工具通过分析开源项目中
                 大量漏洞的修复代码, 从中提取出几种常见的修复模式, 并为自动修复工具针对                          6  类漏洞创建了   10  个修复模板.
                             相较  GenProg  有更好的修复效果. 此外, 在面向开发者的调查中表明, PAR             生成的漏洞修复代码更
                 具可读性, 也更容易被开发者接受.
                    部分基于模板的缺陷修复技术需要迭代地编译与测试修复补丁以获得验证信息. 在这个过程中, 编译和测试时
                 间开销非常高. SketchFix  [12] 技术聚焦于模板修复技术中的效率问题. 该技术通过利用运行时信息在测试验证过程中
                 大幅削减修复候选方案的数量, 以进行更有效的               G&V  程序修复. 在   Defects4J 缺陷数据集的评估结果中, SketchFix
                 在默认设置下平均      23 min  内能正确修复   19  个漏洞, 相较于过去的基于模板的修复技术提高了修复的效率.
                    近期提出的     TBar  [170] 修复技术对过去基于模板的缺陷自动修复工具进行了整合, 总共集成了                  35  种修复模板,
   102   103   104   105   106   107   108   109   110   111   112