Page 105 - 《软件学报》2025年第4期
P. 105
香佳宏 等: 大模型在软件缺陷检测与修复的应用发展综述 1511
展. 这些章节介绍了大模型在理解复杂代码功能、生成有效的测试方案方面的能力. 同时, 部分研究者也尝试使用
大模型的智能解决当下程序自动修复的挑战. 因此, 第 5 节我们将探讨软件缺陷自动修复领域, 这是大模型在软件
缺陷领域中的又一应用.
5 软件缺陷自动修复技术
目前, 随着现代信息技术的迅速发展, 软件程序早已被深度应用到生活的各个领域, 例如监控金融交易 [141] , 控
制交通系统 [142] 以及协助医疗工具 [143] . 然而, 随着软件规模的不断扩大, 软件缺陷的数量也在逐步增加, 并且实际
的软件程序往往会在存在已知和未知缺陷的情况下发布 [144] , 导致大量隐藏缺陷的存在. 这些缺陷会破坏程序的正
常执行, 使程序在一定程度上不能满足其既有的功能需求. 更为严重的是, 这些缺陷可能引发巨大的经济损失, 甚
至对人们的生命安全造成威胁. 然而寻找和修复缺陷是一项困难、耗时且人力密集的工作. 调查研究显示, 在程序
的开发过程中, 开发者大约要花费一半的时间在修复缺陷上. 在美国, 软件维护的年度总成本高达 700 亿美元 [1] .
开发者修复程序中的缺陷既耗时又易出错, 甚至有可能在修复过程中引入新的缺陷 [2] , 使得软件缺陷的修复变得
更加困难. 因此, 及时有效地修复程序中的缺陷显得尤为重要. 为了减轻开发者的负担, 提高修复效率, 软件缺陷自
补丁生成
动修复 (automated program repair, APR) 技术应运而生. 不过与复杂的深度学习库系统架构不同, 现实中的软件通
常遵循传统基础的开发范式和架构, 因此, 过去研究者使用的传统技术在自动修复任务上已经初有成效. 然而在现
实中, 软件程序随着程序规模的增大, 往往变得越来越复杂, 传统的技术也面对越来越严峻的挑战. 进而研究者尝
试使用机器学习等技术进一步提升修复能力. 本节将对该领域技术历史发展轨迹和面临的挑战进行阐述和分析.
具体而言, 本节将首先介绍缺陷自动修复机制, 然后介绍传统和基于学习的缺陷自动修复技术和其代表工作, 进而
本文尝试分析这些技术所面对的关键挑战. 在此基础上, 本文尝试分析大模型驱动软件缺陷自动修复技术的特性
并介绍相关工作, 最后进行展望和总结.
5.1 软件缺陷自动修复技术机制简介
软件缺陷自动修复系统通常可以分为 3 个模块: 缺陷定位 (fault localization)、补丁生成 (patch generation) 以
及补丁测试 (patch validation). 如图 7 所示, 当给定一个缺陷程序, 修复模块 (1) 首先通过缺陷定位技术确定程序中
可能的缺陷位置, 然后模块 (2) 应用补丁生成技术尝试修复缺陷代码, 模块 (3) 最后对生成的补丁进行自动化或者
人工的验证. 在这个系统中, 软件缺陷自动修复技术往往聚焦于模块 (2)(3), 尝试针对漏洞生成有效补丁, 然后使用
排序算法或者启发式规则对生成的补丁进行过滤和排序, 最后验证补丁的有效性. 目前的工作中, 修复中止条件通
常是设定一个固定的时间, 在这个时间内, 自动修复工具反复迭代生成补丁尝试修复漏洞, 或是达到修复目的中止
修复流程. 接下来我们分别介绍缺陷数据库以及自动修复系统中的 3 个模块.
缺陷程序 缺陷代码行 补丁程序 可信补丁 正确补丁
缺陷定位 补丁测试
图 7 软件缺陷自动修复技术机制
● 缺陷数据库: 在实证研究中, 由于缺乏被广泛接受且易于使用的真实项目构成的缺陷数据库, 实证研究的可
重复性在软件测试领域一直是一个挑战. 手动植入的缺陷往往与开发人员无意中引入的缺陷存在差异, 并不适合
评估测试技术. 为解决这样的困难, 2014 年 Just 等人 [145] 提出基于 Java 语言的用于软件测试研究的 Defects4J 缺陷
数据库. 该数据库集成了大量真实的程序缺陷以支持相关研究, 目前已经被广泛应用于评估自动修复工具的修复
能力上. 此外, 为衡量自动修复工具在不同程序语言和不同场景的修复效果, 研究人员还构建了另外一些缺陷数据