[发明专利]一种基于深度学习与程序合成的C/C++程序缺陷自动修复方法有效
申请号: | 201810727406.8 | 申请日: | 2018-07-05 |
公开(公告)号: | CN108829438B | 公开(公告)日: | 2020-04-07 |
发明(设计)人: | 王林章;周风顺;李宣东 | 申请(专利权)人: | 南京大学 |
主分类号: | G06F8/72 | 分类号: | G06F8/72;G06F8/30 |
代理公司: | 南京知识律师事务所 32207 | 代理人: | 张苏沛 |
地址: | 210023 江苏*** | 国省代码: | 江苏;32 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 深度 学习 程序 合成 c++ 缺陷 自动 修复 方法 | ||
本发明基于深度学习与程序合成的C/C++程序缺陷自动修复方法,输入带有缺陷的C/C++程序、错误定位信息、程序需要满足的规约以及满足相同规约正确程序集,通过学习正确程序中的书写结构,建立一个正确书写结构模型;根据错误定位信息,将错误点之前的代码结构作为模型的输入,预测错误点的书写结构,扩展成修复候选项集,并组织成选择表达式的形式;使用程序合成方法,将带有选择表达式的程序和该程序需要满足的规约转化为逻辑表达式,使用约束求解器,在设定的时间内进行求解;根据每个选择表达式的选项,输出最终的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处语句可能的书写结构。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于南京大学,未经南京大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201810727406.8/2.html,转载请声明来源钻瓜专利网。