关键词:
程序自动修复
修复模板
层次聚类
补丁增强
深度学习
摘要:
在程序开发过程中,由于人工编写产生的代码缺陷往往无法避免,严重影响软件质量,而通过测试人员手工修复代码缺陷既耗时又效率低下,严重制约软件产业发展。因此,探索自动、高效的软件缺陷修复方法是目前软件工程领域的一个重要课题。目前,软件自动修复(Automatic Program Repair,APR)技术在学术界以及工业界已经取得了巨大进展,但该领域仍有很多难题需要解决,尤其是针对面向Java的APR方法。一方面,大部分研究者关注的是基于源码的软件自动修复,但事实上,Java字节码比源码更能反映代码语义信息;另一方面,由于APR方法自身的局限性,目前生成的补丁整体正确率偏低,生成的补丁包含大量的近似修复补丁。基于上述问题,本文围绕面向Java的软件自动修复与补丁增强技术展开研究,具体工作包含以下两个方面:(1)针对缺少Java程序在字节码层次的软件自动修复方法的问题,本文提出了基于字节码模板的软件自动修复方法(Byte Code Pattern Auto Program Repair,BCPAPR),通过对真实Java项目中代码缺陷修复过程的挖掘与解析,得到字节码修复模板,从而实现在字节码层次的软件自动修复。首先,方法收集字节码层次的缺陷和修复指令集,并根据真实指令集构建抽象字节码时序链和抽象字节码时序链编辑脚本,用于简化字节码指令的表示和两段字节码指令集差异的表示,然后对编辑脚本进一步抽象生成抽象字节码时序链编辑模板,解决了缺陷修复模板的表示问题。在此过程中,提出了一种新颖的层次聚类算法和最大化缺陷模板匹配规则以提高方法的模板匹配能力,进而产生更多正确补丁。实验表明,BCPAPR方法在缺陷修复能力与修复时间上均有一定改善,尤其是在缺失源码数据时,可以作为面向Java进行软件自动修复的一个有效解决手段。(2)针对目前APR方法生成的补丁整体正确率偏低的问题,本文提出了软件自动修复生成补丁的增强方法(APR Patch Enhancing Method,APRPEM),通过深度学习技术对补丁代码在抽象语法树层次进行节点修正预测(修改、回滚、增加、删除),最终产生对补丁的修正预测信息,实现对APR方法生成的近似修复补丁的增强。在方法的实现中,本文提出了基于孪生网络的分类预测模型(Siamese Code Network for Repatching,SCN4R)解决预测模型构建问题,通过图注意力网络对错误代码、目标代码以及补丁代码向量化,解决代码的向量表示问题,并提出改进的L距离和L距离范数解决代码差异表示的问题,APRPEM方法最终在抽象语法树层面生成对APR生成补丁的修正操作信息,方便后续开发人员或研究人员对软件的改进。