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

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

技术编号:18237480 阅读:49 留言:0更新日期:2018-06-17 00:38
本发明专利技术公开一种基于程序合成的C/C++程序缺陷自动修复方法,输入带有缺陷的C/C++程序,根据常见的程序缺陷和缺陷程序的类型,设置重写规则,重写规则包括缺陷模式和修复选项。之后将缺陷模式与缺陷程序的语法树进行匹配。若不存在任何匹配的重写规则,则表明无法修复该程序的缺陷。若存在匹配的重写规则,则将匹配的语法树子树替换为选择表达式。之后使用程序合成方法,根据该程序需要满足的规约,得到每个选择表达式的选项。程序合成方法将带有选择表达式的程序和该程序需要满足的规约转化为逻辑表达式,之后使用约束求解器,在设定的时间内进行求解,代入每个选择表达式的选项,将语法树输出为C/C++代码,得到修复后的程序。 1

An automatic repair method for C/C++ program defects based on program synthesis

The invention discloses an automatic C/C++ program defect repair method based on program synthesis, input a defective C/C++ program, set rewriting rules according to common program defects and type of defective programs, and rewrite rules including defect mode and repair options. After that, the defect pattern is matched with the syntax tree of the defective program. If there is no matching rewrite rule, it indicates that the defect of the program can not be repaired. If there is a matching rewrite rule, the matching syntax tree subtree is replaced by a selection expression. After that, we use the program synthesis method to get the options of each selection expression according to the specification that the program needs to satisfy. The program synthesis method transforms the program with the choice expression and the protocol that the program needs to transform into logical expression, then uses the constraint solver to solve in the set time, substituting the option of each choice expression, output the syntax tree to C/C++ code, and get the restored program. One

【技术实现步骤摘要】
一种基于程序合成的C/C++程序缺陷自动修复方法
本专利技术涉及一种程序缺陷自动修复方法,使用程序合成方法,实现程序缺陷的自动修复,属于软件工程领域。
技术介绍
在计算机科学领域,程序合成是指在给定规约的情况下,自动地构造程序。由于可以自动生成代码,程序合成通常被使用在代码补全、软件开发、算法设计中。程序合成方法包括合成与验证两个步骤,使用反例制导的方法,将问题转化为SAT/SMT问题,最后使用SAT/SMT求解器进行求解。目前的程序缺陷自动修复方法,通常采用基于测试用例的方法。通常修复后的代码可以通过测试用例,无法保证修复后代码的正确性。程序合成方法包括合成与验证两个步骤,使用程序的规约作为约束,可以保证合成后的代码是正确的。
技术实现思路
目前的程序缺陷自动修复方法,通常采用基于测试用例的方法,无法保证修复后代码的正确性。本专利技术为解决上述技术问题采用以下技术方案:一种基于程序合成的C/C++程序缺陷自动修复方法,包括以下步骤:步骤1)输入带有缺陷的C/C++程序,该程序在测试集S1S2...S0上发现缺陷,存在缺陷d0d0...dk。步骤2)根据常见的C/C++程序缺陷和缺陷程序的类型,设定若干重写规则,重写规则包括缺陷模式和修复选项,其语法结构为:expr->expr1|expr2…,箭头前的表示缺陷模式,箭头后的表示可能的修复选项,对于缺陷di,可能存在多种修复选项,分别记为ci1ci2...ciu.步骤3)将重写规则的缺陷模式与缺陷程序进行匹配,找出所有匹配的重写规则,具体步骤如下:步骤3.1)将带有缺陷的C/C++程序和重写规则解析为抽象语法树。步骤3.2)将缺陷程序的抽象语法树中的每颗子树与重写规则的缺陷模式进行匹配。步骤3.3)若存在部分重写规则与缺陷程序匹配,则表明该缺陷程序存在可能的修复选项。步骤3.4)若不存在任何重写规则与缺陷程序匹配,则表明本方法无法修复该程序的缺陷。步骤4)若存在匹配的重写规则,则将匹配的语法树子树替换为选择表达式,具体步骤如下:步骤4.1)对于每一个重写规则,将每个匹配的语法树子树替换为选择表达式,原始语法树子树作为该选择表达式的第一颗子树。步骤4.2)将该重写规则的若干个修复选项作为选择表达式的后续子树。步骤4.3)将每个选择表达式分别记为e1e2...em,若ei取0则表明该选择表达式的选项为第一颗子树,即原始程序代码,若ei取1则表明该选择表达式的选项为第二颗子树,即该缺陷模式的第一个修复选项ci1,依次类推。步骤5)将该程序需要满足的规约记为f,规约约定了程序在特定输入下需要满足的输出。使用程序合成方法,根据该程序的规约f,得到每个选择表达式的选项,具体步骤如下:步骤5.1)将带有选择表达式的程序和该程序的规约转化为逻辑表达式,格式如下:S1S2...Sn为程序的测试用例,ei表示每个选择表达式的选项,f′为带选择表达式的程序,f为该程序需要满足的规约。步骤5.2)使用约束求解器,在设定的时间t内,对上述的逻辑表达式进行求解。若对S1S2...Sn存在e1e2…en使得公式成立,则表明对于该程序的缺陷,本方法可以修复。若无解或超时,则本方法无法修复该程序的缺陷。步骤6)若步骤5有解,则代入每个选择表达式的选项,得到修复后的程序,具体步骤如下:步骤6.1)对于每个选择表达式,将选项表示的子树代替选择表达式,得到修复后的语法树。步骤6.2)将语法树输出为C/C++代码,得到修复后的程序。有益效果:本专利技术采用以上技术方案,与现有技术相比,具体以下有益效果:1.根据常见的C/C++程序缺陷输入重写规则,本方法可以修复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)输入带有缺陷的C/C++程序,该程序在测试集S1S2...Sn上发现缺陷,存在缺陷d1d2,如图2所示。2)根据常见的C/C++程序缺陷和缺陷程序的类型,设定若干重写规则,重写规则包括缺陷模式和修复选项,其语法结构为:expr->expr1|expr2…,箭头前的表示缺陷模式,箭头后的表示可能的修复选项,对于缺陷di,可能存在多种修复选项,分别记为ci1ci2…ciu,如图3所示。3)将重写规则的缺陷模式与缺陷程序进行匹配,找出所有匹配的重写规则,具体步骤如下:3.1)将带有缺陷的C/C++程序和重写规则解析为抽象语法树。3.2)将缺陷程序的抽象语法树中的每颗子树与重写规则的缺陷模式进行匹配。3.3)存在部分重写规则与缺陷程序匹配,表明该缺陷程序存在可能的修复选项。4)对于匹配的两个重写规则,将匹配的语法树子树替换为选择表达式,具体步骤如下:4.1)对于这两个重写规则,将匹配的语法树子树替换为选择表达式,原始语法树子树作为该选择表达式的第一颗子树。4.2)将该重写规则的若干个修复选项作为选择表达式的后续子树。4.3)将这两个选择表达式分别记为e1e2,这两个选择表达式如下所示:(w-max-min)/(n-2)|double(w-max-min)/double(n-2)i<=n|i<=n+1|i<=n-15)将该程序需要满足的规约记为f,规约约定了程序在特定输入下需要满足的输出。使用程序合成方法,根据该程序的规约f,得到每个选择表达式的选项,具体步骤如下:5.1)将带有选择表达式的程序和该程序的规约转化为逻辑表达式,格式如下:S1S2…Sn为程序的测试用例,e1e2表示两个选择表达式的选项,f′为带选择表达式的程序,f为该程序需要满足的规约。5.2)使用约束求解器,在设定的时间30分钟内,对上述的逻辑表达式进行求解。得到d1=1d2=2.6)将步骤5的结果代入每个选择表达式的选项,得到修复后的程序,具体步骤如下:6.1)对于这两个选择表达式,将选项表示的子树代替本文档来自技高网...
一种基于程序合成的C/C++程序缺陷自动修复方法

【技术保护点】
1.一种基于程序合成的C/C++程序缺陷自动修复方法,其特征在于,该方法包括以下步

【技术特征摘要】
1.一种基于程序合成的C/C++程序缺陷自动修复方法,其特征在于,该方法包括以下步骤:步骤1)输入带有缺陷的C/C++程序,该程序在测试集S1S2…Sn上发现缺陷,存在缺陷d1d2...dk;步骤2)根据常见的C/C++程序缺陷和缺陷程序的类型,设定若干重写规则,重写规则包括缺陷模式和修复选项,其语法结构为:expr->expr1|expr2…,箭头前的表示缺陷模式,箭头后的表示可能的修复选项,对于缺陷di,可能存在多种修复选项,分别记为ci1ci2...ciu;步骤3)将重写规则的缺陷模式与缺陷程序进行匹配,找出所有匹配的重写规则;步骤4)若存在匹配的重写规则,则将匹配的语法树子树替换为选择表达式;步骤5)将该程序需要满足的规约记为f,规约约定了程序在特定输入下需要满足的输出,使用程序合成方法,根据该程序的规约f,得到每个选择表达式的选项;步骤6)若步骤5)有解,则代入每个选择表达式的选项,得到修复后的程序。2.根据权利要求1所述的基于程序合成的C/C++程序缺陷自动修复方法,其特征在于:所述步骤3)将重写规则的缺陷模式与缺陷程序进行匹配,找出所有匹配的重写规则,具体步骤如下:步骤3.1)将带有缺陷的C/C++程序和重写规则解析为抽象语法树;步骤3.2)将缺陷程序的抽象语法树中的每颗子树与重写规则的缺陷模式进行匹配;步骤3.3)若存在部分重写规则与缺陷程序匹配,则表明该缺陷程序存在可能的修复选项;步骤3.4)若不存在任何重写规则与缺陷程序匹配,则表明本方法无法修复该程序的缺陷。3.根据权利要求1所述的基于程序合成的C/C++程序缺陷自动修复方法,其特征在于:所述步骤4)若存在匹配的重写规则,则将匹配的语法树子树替换为选择表达式,具体步骤如下:步骤4.1)对于每一个重写规则,将每个匹配的语法树子树替换为选择表达式,原始语法树子树作为该选择表达式的第一颗子树;步骤4.2)将该重写规则的若干个修复选项作为选择表达式的后续子树...

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

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

1