一种基于双向重构的控制结构对齐方法

文档序号:35496642发布日期:2023-09-19 23:22阅读:30来源:国知局
一种基于双向重构的控制结构对齐方法

本发明涉及静态分析,特别是涉及一种基于双向重构的控制结构对齐方法。


背景技术:

1、静态分析技术是指在不运行程序的条件下,进行程序分析的方法。程序的控制结构是控制程序执行顺序的结构,最基本的程序控制结构有顺序、选择、循环三种。理论和实践证明,无论多复杂的算法均可以通过顺序、选择、循环3中基本结构构造而来。我们借助解析器工具从程序语法树的角度对源码结构进行静态分析从而构建程序的抽象控制流树模型。常见的java语言词法解析的工具为javaparser,它支持java语言生成ast,支持修改ast从而生成新的java文件内容。常见的python语言词法解析器工具为python ast,它有着与javaparser类似的功能。

2、自动反馈生成技术旨在帮助学生更好地理解程序、发现程序中的缺陷以及学会如何修复程序中缺陷。这类技术在实践过程中扮演着助教老师的角色,通常以错误程序p以及一组正确的实现作为方法的输入,输出修复后的程序p’。近年来的自动反馈生成技术clara以及sarfgen,采取了“块对块”的修复策略,在修复入门级编程作业上展现了不凡的优势。他们为错误程序匹配到一个最接近的且控制结构对齐的正确程序作为参考,通过用参考程序的相应块中的表达式替换原表达式的方式来生成对错误程序的每个基本块的修复。因此他们对现有数据集有着更严格的要求,要求数据集中需要至少包含一个或多个与错误程序有着一模一样的控制结构的正确实现。他们的方法失效于当不存在这样的一个与错误程序控制结构匹配的正确程序。为了从根本上解决该缺陷,我们实现了基于双向重构的控制结构对齐方法,使得降低了对数据集的要求,在为错误程序匹配到最接近的正确程序后,我们不要求该正确程序拥有一模一样的控制结构,通过我们的工具对齐两程序的结构后,再运行“块对块”的修复策略。


技术实现思路

1、为解决上述现有技术中存在的问题,本发明提供一种基于双向重构的控制结构对齐方法,该方法使用静态分析技术为两个具有相似功能的程序建立控制流节点的最优匹配,并基于此执行最小的重构操作,实现控制结构对齐,从而从根本上解决现有自动反馈生成技术存在的缺陷,本发明通过以下技术方案来实现。

2、一种基于双向重构的控制结构对齐方法,其特征在于,包括如下步骤:

3、步骤1)输入两个程序和目标函数,将所述程序和目标函数命名为源程序p、源程序q以及目标函数,作为方法的输入;

4、步骤2)设计一种表示程序目标函数控制流结构的抽象控制流树模型;

5、步骤3)分别构建源程序p与源程序q中目标函数的抽象控制流树模型;

6、步骤4)设计抽象控制流树模型中节点的合法匹配规则;

7、步骤5)构建源程序p与源程序q中目标函数的抽象控制流树模型中的节点间“最长”的合法匹配集合,并从中选出最优匹配;

8、步骤6)设计通用的程序重构规则,重构前后程序语义不发生改变;

9、步骤7)基于所述步骤5)得到的最优匹配重构源程序p与源程序q的目标函数,以实现控制结构对齐,得到重构后的程序p’以及程序q’。

10、上述的基于双向重构的控制结构对齐方法,其特征在于,所述步骤1)输入的两个程序和目标函数需要符合要求待结构对齐的两程序中均包含目标函数的实现。

11、上述的基于双向重构的控制结构对齐方法,其特征在于,所述步骤2)设计一种表示程序目标函数控制流结构的抽象控制流树模型具体包括以下步骤:

12、步骤21)规定抽象控制流树模型中的每一个节点n拥有如下性质:节点类型,记为type(n);节点标签,记为label(n);包含0个或多个子节点,记为children(n);父亲节点,记为parent(n);祖先节点,记为ancestors(n);

13、步骤22)规定抽象控制流树模型有三种类型的节点,所述节点包括:函数入口节点(method declaration),对应于函数的入口,所述函数入口节点为抽象控制流树模型的根节点;控制流节点(control-flow node),对应于函数中的控制流语句;分支节点(branchnode),对应于if语句的不同分支,then分支与else分支;

14、步骤23)规定函数入口节点的标签为methodentry,所述入口节点的父亲节点为空,祖先节点个数为0,子节点的类型为控制流节点;

15、步骤24)规定控制流节点有4个不同的标签,所述标签包括:for语句(forstatement);foreach语句(foreachstatement);while语句(whilestatement);if语句(ifstatement);所述if语句的子节点的类型只可能为分支节点,其他控制流节点的子节点的类型为控制流节点;

16、步骤25)规定分支节点有2个不同的标签,所述标签为then分支(then branch)和else分支(else branch),所述分支节点的父亲节点的类型为标签为if语句的控制流节点,所述分支节点的子节点的类型为控制流节点。

17、上述的基于双向重构的控制结构对齐方法,其特征在于,所述步骤3)分别构建源程序p与源程序q中目标函数的抽象控制流树模型具体包括以下步骤:

18、步骤31)使用解析器工具(例如java解析器工具javaparser,python解析器工具python ast)提取程序目标函数的抽象语法树;

19、步骤32)深度优先遍历程序目标函数的抽象语法树,当遍历到目标函数入口时,创建抽象控制流树模型的根节点,并建立所述根节点到抽象语法树节点的链接;

20、步骤33)继续深度优先遍历程序目标函数的抽象语法树,当遍历到控制流语句时,创建抽象控制流树模型的控制流节点,并建立所述控制流节点到抽象语法树节点的链接;同时建立节点间的父子关系,抽象控制流树模型中节点的父子关系与抽象语法树中的父子关系一一对应;

21、步骤34)当遍历到if语句时,创建标签为if语句的控制流节点,并为所述控制流节点创建then分支子节点,若if语句包含else分支,则继续为if控制流节点创建else分支子节点;分别遍历抽象语法树中所述if语句的不同分支,完成抽象控制流树模型的构造;

22、步骤35)执行所述步骤31)-34)以构建源程序p中目标函数的抽象控制流树模型;

23、步骤36)执行所述步骤31)-34)以构建源程序q中目标函数的抽象控制流树模型。

24、上述的基于双向重构的控制结构对齐方法,其特征在于,所述步骤4)设计抽象控制流树模型中节点的合法匹配规则的设计过程包括:假设当前两个抽象控制流树模型t1与t2间节点的合法匹配为m,新的节点对pair(t1.x,t2.y)加入到所述合法匹配m后,新的匹配m’依旧是合法的,所述合法匹配规则包括:

25、(1)规定合法匹配规则一,若t1.x t2.y可以构成节点对,则需要满足下列三种情况之一:两者均为函数入口节点;两者均为标签一致的控制流节点;两者均为分支节点,标签可以不同;

26、(2)规定合法匹配规则二,若存在t1.x/t2.y的祖先节点t1.xc/t2.yc在合法匹配m中,则所述节点t1.x/t2.y在匹配m中所匹配的节点t2.yd/t1.xd也应该是t2.y/t1.x的祖先节点;

27、(3)规定合法匹配规则三,若t1.x与t2.y均为分支节点,则pair(parent(t1.x),parent(t2.y))也应该在匹配m中;

28、(4)规定合法匹配规则四,若t1.x/t2.y是循环节点的子代,则t1.x/t2.y的所有循环祖先节点都应该在匹配m中;

29、(5)规定合法匹配规则五,若t1.x/t2.y是某不在匹配m中的flse分支的子代,则所述flse分支的父亲节点的then分支t以及t的所有子代均不在匹配m中。

30、上述的基于双向重构的控制结构对齐方法,其特征在于,所述步骤5)构建源程序p与源程序q中目标函数的抽象控制流树模型中的节点间“最长”的合法匹配集合,并从中选出最优匹配具体包括以下步骤:

31、步骤51)规定“最长”的合法匹配集合s,m={pair1,pair2,...,pairw}为s中任一合法匹配,pairw为合法匹配m中最后一个匹配对,若m不为其他包含pairw在内的合法匹配的子集,那么称合法匹配集合s为“最长”的合法匹配集合;

32、步骤52)深度优先遍历源程序p与源程序q中目标函数的抽象控制流树模型t1与t2,得到抽象控制流树序列x与y;

33、步骤53)规定头部系列ln表示抽象控制流树序列l的前n个节点构成的子序列;

34、步骤54)假设抽象控制流树序列x=(x1,x2,...,xm)与y=(y1,y2,...,yn)。x的头部序列为x0,x1,...,xm,y的头部序列为y0,y1,...,yn。规定llm(xi,yj)表示xi与yj的“最长”的合法匹配的集合。llm(xi,yj)的状态转移方程如下(令ma=llm(xi-1,yj-1),mb=llm(xi-1,yj),mc=llm(xi,yj-1)):(1)如果i=0或j=0,(2)如果i>0且j>0,若xi与yj不满足合法匹配规则零,也就是说xi与yj无法构成匹配对,llm(xi,yj)=(mb-ma)∪(mc-ma)∪(mb∩mc);(3)如果i>0且j>0,若xi与yj满足合法匹配规则零,令ml存储了ma中可以合法加入匹配对pair(xi,yj)的所有匹配。若ml为空,则继续搜索llm(xi-2,yj-2),llm(xi-3,yj-3)…直到ml不为空或者到达了搜索边界。llm(xi,yj)=(mb-ma)∪(mc-ma)∪((mb∩mc)-ml)∪(ml^(i,j));

35、步骤55)计算求得llm(xm,yn),即为源程序p与源程序q中目标函数的抽象控制流树模型中的节点间“最长”的合法匹配集合;

36、步骤56)规定最优匹配需要包含最多数量的循环节点;

37、步骤57)规定最优匹配满足所述步骤56),同时需要包含最多数量的节点;

38、步骤58)规定最优匹配满足所述步骤56)和步骤57),同时匹配对之间的高度差之和最小;

39、步骤59)基于所述步骤56)-58)从所述步骤55)中获得的匹配集合中选出源程序p与源程序q中目标函数的抽象控制流树模型中的节点间的最优匹配。

40、上述的基于双向重构的控制结构对齐方法,其特征在于,所述步骤6)设计通用的程序重构规则具体包括以下步骤:

41、步骤61)规定重构规则一:交换if语句的分支,同时取反if语句的条件;

42、步骤62)规定重构规则二:引入新的控制流节点,所述控制流节点主要分成4种类型,包括(1)引入新的if节点;(2)引入新的while节点;(3)引入新的for节点;(4)引入新的foreach节点;

43、步骤63)规定重构规则三:引入新的if防护或if-else防护;为程序块加一个if防护或者if-else防护。

44、上述的基于双向重构的控制结构对齐方法,其特征在于,所述步骤7)基于所述步骤5)得到的最优匹配重构源程序p与源程序q的目标函数,以实现控制结构对齐,得到重构后的程序p’和程序q’具体包括以下步骤:

45、步骤71)扫描最优匹配中的匹配对,若存在匹配对的类型为分支节点间的匹配,但两节点的标签不一致的情况,采用所述步骤61)规定的重构规则一交换源程序p中对应节点的父亲节点的分支,得到重构后的程序p;

46、步骤72)若程序p发生改变,重新执行所述步骤3)构建程序p的抽象控制流树模型,并执行所述步骤5)构建程序p与源程序q中目标函数的抽象控制流树模型中的节点间“最长”的合法匹配集合,并从中选出最优匹配;

47、步骤73)扫描程序p的目标函数的抽象控制流树序列x,若存在节点不在最优匹配中,则采用所述步骤62)规定的重构规则二在程序q的目标函数的抽象控制流树中插入新的控制结构节点或者采用所述步骤63)规定的重构规则三插入新的if或if-else防护;

48、步骤74)扫描程序q的目标函数的抽象控制流树序列y,若存在节点不在最优匹配中,则采用所述步骤62)规定的重构规则二在程序p的目标函数的抽象控制流树中插入新的控制结构节点或者采用所述步骤63)规定的重构规则三插入新的if或if-else防护;

49、步骤75)得到重构后的程序p’和程序q’,所述程序p’和程序q’的目标函数控制结构保持一致。

50、本发明采用以上技术方案,具有以下有益效果:

51、本方法利用静态分析的方法构建程序的抽象控制流树模型,通过构建控制流树模型间节点的“最长”的合法匹配集合,得到控制流树模型间节点的最优匹配,并基于此重构代码,可以为两个控制结构不一致的程序在程序语义不发生改变的前提下提供双向重构指导,实现目标函数的控制结构的对齐,从根本上解决了现有自动反馈生成技术存在的缺陷。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1