[发明专利]一种基于深度学习与程序合成的C/C++程序缺陷自动修复方法有效
申请号: | 201810727406.8 | 申请日: | 2018-07-05 |
公开(公告)号: | CN108829438B | 公开(公告)日: | 2020-04-07 |
发明(设计)人: | 王林章;周风顺;李宣东 | 申请(专利权)人: | 南京大学 |
主分类号: | G06F8/72 | 分类号: | G06F8/72;G06F8/30 |
代理公司: | 南京知识律师事务所 32207 | 代理人: | 张苏沛 |
地址: | 210023 江苏*** | 国省代码: | 江苏;32 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 深度 学习 程序 合成 c++ 缺陷 自动 修复 方法 | ||
1.一种基于深度学习与程序合成的C/C++程序缺陷自动修复方法,输入带有缺陷的C/C++程序、错误定位信息、程序需要满足的规约以及满足相同规约正确程序集,通过学习正确程序中的书写结构,建立一个正确书写结构模型;根据错误定位信息,将错误点之前的代码结构作为模型的输入,预测错误点的书写结构,扩展成修复候选项集,并组织成选择表达式的形式;使用程序合成方法,将带有选择表达式的程序和该程序需要满足的规约转化为逻辑表达式,使用约束求解器,在设定的时间内进行求解;根据每个选择表达式的选项,输出最终的C/C++代码,即得到修复后的程序;其特征在于,包括以下步骤:
步骤1)输入带有缺陷的C/C++程序及其需要满足的规约,并输入该程序的缺陷定位信息,表示为{d1d2...dk};
步骤2)输入满足相同规约的正确程序集{p1p2...pn},将其转化成线性序列集{l1l2...ln},学习其中的书写结构,构建书写结构模型,具体步骤如下:
步骤2.1)将正确的C/C++程序解析为抽象语法树;
步骤2.2)先序遍历抽象语法树,将抽象语法树转化为抽象线性序列,并添加“{”、“}”将抽象语法树中每个中间节点包裹起来;
步骤2.3)将正确程序集{p1p2...pn}转化成线性序列集{l1l2...ln},并截取固定长度序列作为训练数据;采用长短期记忆网络,利用梯度下降优化算法训练全部数据,得到书写结构模型;
步骤3)根据书写结构模型,将缺陷位置之前的代码转化所得的抽象线性序列作为模型的输入,预测缺陷处的语句结构,扩展语句结构并产生修复候选项,具体步骤如下:
步骤3.1)对于缺陷位置di,将该缺陷位置之前的代码转化为抽象线性序列;
步骤3.2)将转化后的抽象线性序列作为书写结构模型的输入,预测缺陷位置di处语句可能的书写结构;
步骤3.3)用程序当前可见的变量名扩展预测到的书写结构,得到多种修复候选项,分别记为ci1ci2...ciu,并组织为选择表达式的形式;
步骤3.4)对每一个缺陷位置,重复步骤3.1-步骤3.3,为每一个缺陷位置产生一组修复候选项;
步骤4)利用程序合成方法,为每一个缺陷位置选择修复选项,得到修复后的程序,具体步骤如下:
步骤4.1)将缺陷程序、缺陷定位信息以及修复后选项结合,得到扩展的带有选择表达式的C/C++程序;
步骤4.2)将程序需要满足的规约作为约束,运用程序合成技术求解扩展的带有选择表达式的C/C++程序,为每一处选择表达式确定最终的选项,得到c1c2...ck;
步骤4.3)根据每一处选择表达式的选项,替换对应的选择表达式,得到修复后的程序。
2.根据权利要求1所述的基于深度学习与程序合成的C/C++程序缺陷自动修复方法,其特征在于:学习正确程序的书写结构,本方法能够修复C/C++程序的常见缺陷。
3.根据权利要求1所述的基于深度学习与程序合成的C/C++程序缺陷自动修复方法,其特征在于:本方法能够在多项式的时间复杂度内实现缺陷修复。
4.根据权利要求1所述的基于深度学习与程序合成的C/C++程序缺陷自动修复方法,其特征在于:本方法使用程序合成方法,根据程序需要满足的规约,实现缺陷修复,保证修复后程序的正确性。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于南京大学,未经南京大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201810727406.8/1.html,转载请声明来源钻瓜专利网。