当前位置: 首页 > 专利查询>南京大学专利>正文

一种基于深度学习与程序合成的C/C++程序缺陷自动修复方法技术

技术编号:19489040 阅读:20 留言:0更新日期:2018-11-17 12:01
本发明专利技术基于深度学习与程序合成的C/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处语句可能的书写结构。步骤3.3)用程序当前可见的变量名扩展预测到的书写结构,得到多种修复候选项,分别记为ci1ci2...ciu,并组织为选择表达式的形式。步骤3.4)对每一个缺陷位置,重复步骤3.1—步骤3.3,为每一个缺陷位置产生一组修复候选项。步骤4)利用程序合成方法,为每一个缺陷位置选择修复选项,得到修复后的程序,具体步骤如下:步骤4.1)将缺陷程序、缺陷定位信息以及修复后选项结合,得到扩展的带有选择表达式的C/C++程序。步骤4.2)将程序需要满足的规约作为约束,运用程序合成技术求解扩展的带有选择表达式的C/C++程序,为每一处选择表达式确定最终的选项,得到c1c2...ck。步骤4.3)根据每一处选择表达式的选项,替换对应的选择表达式,得到修复后的程序。有益效果:本专利技术采用以上技术方案,与现有技术相比,具体以下有益效果:1.学习正确程序的书写结构,本方法可以修复C/C++程序的常见缺陷。2.本方法可以在多项式的时间复杂度内实现缺陷修复。3.本方法使用程序合成方法,根据程序需要满足的规约,实现缺陷修复,可以保证修复后程序的正确性。附图说明图1是基于深度学习与程序合成的C/C++程序缺陷自动修复方法的流程图。图2是带缺陷的C/C++程序实例。图3是程序转化为抽象序列实例。具体实施方式下面对本专利技术使用的基于深度学习与程序合成的C/C++程序缺陷自动修复方法具体实施方式做更详细的描述。本实施例的基于深度学习与程序合成的C/C++程序缺陷自动修复方法。该方法输入带有缺陷的C/C++程序、错误定位信息、程序需要满足的规约以及满足相同规约正确程序集,通过学习正确程序中的书写结构,建立一个正确书写结构模型。之后根据错误定位信息,将错误点之前的代码结构作为模型的输入,预测错误点的书写结构,扩展成修复候选项集,并组织成选择表达式的形式。之后使用程序合成方法,将带有选择表达式的程序和该程序需要满足的规约转化为逻辑表达式,使用约束求解器,在设定的时间内进行求解。最后根据每个选择表达式的选项,输出最终的C/C++代码,即得到修复后的程序。本方法能在多项式的时间复杂度内修复C/C++程序的常见缺陷,并且本方法保证修复后程序的正确性如图1所示,本实施例的基于深度学习与程序合成的C/C++程序缺陷自动修复方法的流程图。根据附图1所示的流程图,本专利技术的具体实施方式为:步骤1)输入带有缺陷的C/C++程序及其需要满足的规约,并输入该程序的缺陷定位信息d1,如图2所示带缺陷的C/C++程序实例。步骤2)输入满足相同规约的正确程序集{p1p2...pn},将其转化成线性序列集{l1l2...ln},学习其中的书写结构,构建书写结构模型,具体步骤如下:步骤2.1)将正确的C/C++程序解析为抽象语法树。步骤2.2)先序遍历抽象语法树,将抽象语法树转化为抽象线性序列,并添加“{”、“}”将抽象语法树中每个中间节点包裹起来。步骤2.3)将正确程序集{p1p2...pn}转化成线性序列集{l1l2...ln},并截取固定长度序列作为训练数据。采用长短期记忆网络,利用梯度下降优化算法训练全部数据,得到书写结构模型。步骤3)根据书写结构模型,将缺陷位置之前的代码转化所得的抽象线性序列作为模型的输入,预测缺陷处的语句结构,扩展语句结构并产生修复候选项,具体步骤如下:步骤3.1)对于缺陷位置d1,将该对于缺陷位置之前的代码转化为抽象线性序列。步骤3.2)将转化后的抽象线性序列作为书写结构模型的输入,预测缺陷位置d1处语句可能的书写结构。期望得到的预测结果为BINARY_OPERATOR{operator(=)VARARRAY}。步骤3.3)用程序当前可见的变量名扩展预测到的书写结构,得到多种修复候选项,并组织为选择表达式的形式。得到的选择表达式如下所示:{max|min|sum}=nums[{i|max|min|sum|??}]步骤4)利用程序合成方法,为每一个缺陷位置选择修复选项,得到修复后的程序,具体步骤如下:步骤4.1)将缺陷程序、缺陷定位信息以及修复后选项结合,得到扩展的带有选择表达式的C/C++程序。步骤4.2)将程序需要满足的规约作为约束,运用程序合成技术求解扩展的带有选择表达式的C/C++程序,为每一处选择表达式确定最终的选项。最终的选择表达式为:min=nums[i]步骤4.3)根据每一处选择表达式的选项,替换对应的选择表达式,得到修复后的程序。修复后程序如下:图3是程序转化为抽象序列实例。本专利技术书中所描述的以上内容仅是对本专利技术的所做的举例说明。本专利技术所属
的技术人员可以对所描述的具体实施例做各种本文档来自技高网
...

【技术保护点】
1.一种基于深度学习与程序合成的C/C++程序缺陷自动修复方法,其特征在于:输入带有缺陷的C/C++程序、错误定位信息、程序需要满足的规约以及满足相同规约正确程序集,通过学习正确程序中的书写结构,建立一个正确书写结构模型;根据错误定位信息,将错误点之前的代码结构作为模型的输入,预测错误点的书写结构,扩展成修复候选项集,并组织成选择表达式的形式;使用程序合成方法,将带有选择表达式的程序和该程序需要满足的规约转化为逻辑表达式,使用约束求解器,在设定的时间内进行求解;根据每个选择表达式的选项,输出最终的C/C++代码,即得到修复后的程序。

【技术特征摘要】
1.一种基于深度学习与程序合成的C/C++程序缺陷自动修复方法,其特征在于:输入带有缺陷的C/C++程序、错误定位信息、程序需要满足的规约以及满足相同规约正确程序集,通过学习正确程序中的书写结构,建立一个正确书写结构模型;根据错误定位信息,将错误点之前的代码结构作为模型的输入,预测错误点的书写结构,扩展成修复候选项集,并组织成选择表达式的形式;使用程序合成方法,将带有选择表达式的程序和该程序需要满足的规约转化为逻辑表达式,使用约束求解器,在设定的时间内进行求解;根据每个选择表达式的选项,输出最终的C/C++代码,即得到修复后的程序。2.根据权利要求1所述的基于深度学习与程序合成的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)根据书写结构模型,将缺陷位置之前的代码转化所得的抽象线性序列作为模型的输...

【专利技术属性】
技术研发人员:王林章周风顺李宣东
申请(专利权)人:南京大学
类型:发明
国别省市:江苏,32

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1