源代码等价性验证装置以及源代码等价性验证方法_5

文档序号:9650596阅读:来源:国知局
构模式输入部1102接受重构模式输入信息0003来生成重构模式信息1003。在该例子中,例如当重构模式输入信息0003为表示重构模式参数化方法的字符串“表示重构模(ParameterizedMethod) ”或画面菜单中的选择编号时,参照重构模式登录信息1120,在内部生成用于指示重构模式参数化方法的代码即重构模式信息1003。
[0221]接着,对图5的变更位置确定S1041的步骤进行说明。
[0222]在正规化部1200的变更位置确定部1201中,根据重构前源代码信息1001、重构后源代码信息1002以及重构模式信息1003,参照与登录在正规化DB1601中的对应的变更位置确定信息1007b,确定变更了源代码上的哪些地方并输出变更位置信息1004。在该重构模式参数化方法的例子中,重构模式参数化方法根据在重构后源代码信息1002函数增加的特征,比较重构前源代码信息1001和重构后源代码信息1002的函数的声明,将仅在重构后源代码信息1002出现的函数声明节点确定为变更位置信息。此外,将调用仅在重构后源代码信息1002出现的函数的节点也设为变更位置信息1004。在图22和图23中,在重构前源代码信息1001的结构图M017和重构后源代码信息1002的结构图M018中,比较表示函数的进入(entry)节点,节点M019指示的进入(entry)节点的函数baz增加,因此节点M019相当于变更位置信息1004。并且,调用函数baz的节点M020和M021也相当于变更位置信息1004。
[0223]接着,对图5的源代码信息正规化S1042的步骤进行说明。在正规化部1200的源代码正规化部1202中,根据变更位置信息1004和重构前源代码信息1001使用与正规化DB1601中的对应的正规化信息1007a来进行正规化,生成重构前正规化源代码信息1005。重构后源代码信息1002也同样地进行正规化,生成重构后正规化源代码信息1006。根据作为重构模式信息1003的与重构模式参数化方法对应的正规化信息1007a,正规化方法将针对重构后源代码信息0002在变更位置1004识别并提取的函数设为表示进行内联扩展时的源代码的结构。表示针对重构后源代码信息1002通过源代码正规化部1202进行了正规化的例子时,成为如图24所示。
[0224]图24中的变更位置是重构后源代码信息1002的结构图M018中的节点M019、节点M020以及节点M021,这些节点是通过重构提取的函数baz的声明以及调用位置,因此若对该函数baz进行正规化并内联扩展,则成为结构图M022。其成为重构后正规化源代码信息1006。重构前正规化源代码信息1005关于重构模式参数化方法,没有进行正规化处理,因此重构前源代码信息1001的结构图M017在正规化中没有任何变更,而直接成为重构前正规化源代码信息1005。
[0225]接着,对图5的构造比较S1043的步骤进行说明。
[0226]在结构比较验证处理部1300中接受重构前正规化源代码信息1005和重构后正规化源代码信息1006,进行源代码信息的结构的比较,将其结果生成为结构比较结果1008。在进行了基于重构模式参数化方法的重构的图21的例子中,结构比较验证处理部1300比较重构前正规化源代码信息1005的图M017和重构后正规化源代码信息1006的图M022两个图,图结构明确不同,因此将结构比较结果1008判定为重构前后的源代码为结构不一致的非等价。
[0227]接着,对图5的符号执行实施判定步骤S1047进行说明。
[0228]在该重构例子中,作为结构比较结果1008,符号执行实施判定部1700判定为源代码非等价,因此生成符号执行开始指示1009的指令。
[0229]接着,对图5的源代码信息抽象化步骤S1044进行说明。
[0230]在符号执行验证处理部1400接受符号执行开始指示1009时,在抽象化部1401使用变更位置信息1004和抽象化DB1602的记录了抽象化方法的抽象化信息1010进行重构前正规化源代码信息1005和重构后正规化源代码信息1006的抽象化。在抽象化DB1602的抽象化信息1010中与重构模式信息1003和变更位置信息1004对应地登录有恰当的抽象化方法。在重构模式信息1003为重构模式参数化方法的例子中,比较重构前正规化源代码信息1005即图M017与重构后正规化源代码信息1006即图M022,从抽象化DB1602取得记载了删除所有具有相同图结构的位置的抽象化信息1010。表示在抽象化部1401中对重构前正规化源代码信息1005即图M017和重构后正规化源代码信息1006即图M022应用抽象化信息1010而得的结果时,成为如图25所示。比较表示重构前正规化源代码信息1005即图M017的函数fool的图与表示重构后正规化源代码信息1006即图M022的函数fool的图时,调用函数bar的图M017的节点M023和图M022的节点M025 —致,调用函数qux的图M017的节点M024和图M022的节点M026 —致,因此删除这些节点,同样地对函数foo2删除所有的具有相同图结构的位置时,重构前正规化源代码信息1005即图表M017被抽象化成图M027,重构后正规化源代码信息1006即图M022被抽象化成图表M028。图M027相当于重构前抽象化源代码信息1403,图M028相当于重构后抽象化源代码信息1404。在此,应注意关于该抽象化,在各个图M017、M022中,节点数量减少,对各个图进行了符号执行时其计算量减小。
[0231]接着,对图5的符号执行S1045的步骤进行说明。
[0232]在符号执行验证处理部1400中,在抽象化部1401进行了抽象化后,在符号执行部1402分别对重构前抽象化源代码信息1403和重构后抽象化源代码信息1404实施符号执行,作为其结果生成重构前符号执行结果1405和重构后符号执行结果1406。在该重构例子中,在符号执行部1402对上述重构前抽象化源代码信息1403和重构后抽象化源代码信息1404的各个函数fool进行了符号执行的结果,成为如图26所示。在该重构例子中,重构前抽象化源代码信息1403相当于图25的结构图M027。对结构图M027进行符号执行时,能够得到图26中的执行树E300。此外,图26的执行树E300中的符号执行一览即E301成为与重构前抽象化源代码信息1403对应的重构前符号执行结果1405。在图21的重构例子中,重构后抽象化源代码信息1404相当于图25的结构图M028,对结构图M028进行符号执行时,能够得到图26中的执行树E400。此外,图26的执行树E400中的符号执行一览即E401、E402成为与重构后抽象化源代码信息1404对应的重构后符号执行结果1406。关于函数foo2,在符号执行部1402中同样地分别对重构前抽象化源代码信息1403和重构后抽象化源代码信息1404进行符号执行。对重构前抽象化源代码信息1403生成执行树E350,执行树E350中的符号执行一览即E351成为重构前符号执行结果1405。对重构后抽象化源代码信息1404生成执行树E450,其符号执行一览即E451和E452成为重构后符号执行结果1406ο
[0233]接着,对图5的符号执行结果比较S1046的步骤进行说明。
[0234]在符号执行验证处理部1400的符号执行结果比较部1407中,进行重构前符号执行结果1405和重构后符号执行结果1406的比较,进行重构前后的源代码等价还是非等价的判定。在图21的重构例子中,针对函数fool的重构前符号执行结果1405是E301,重构后符号执行结果1406是E40UE402。通过SAT解法比较这两个符号执行结果,由此符号执行结果比较部1407对函数fool判定源代码等价。在该例子中,从因E402的路径制约为矛盾式而认为E402不存在,以及E301和E401的变量状态一致,且路径制约都是恒真式中知道符号执行一览等价。此时,因为在重构前的符号执行树E300和重构后的符号执行树E400之间产生结构上的差异,但符号执行的最终的符号执行一览逻辑上等价,因此判定为源代码等价。在符号执行结果比较部1407中,对函数foo2同样地进行比较,并判定为等价。从因E451的路径制约为矛盾式而认为E451不存在,以及E351和E452的变量状态一致,且路径制约都是恒真式中也可知道针对函数foo2的符号执行一览等价。符号执行比较部将判定的结果发送给输出部1500。
[0235]接着,对图5的等价非等价输出S105的步骤进行说明。
[0236]输出部1500接受符号执行结果比较部1407判定为源代码等价的结果后,作为验证结果0004输出源代码等价。图27表示输出部1500输出的验证结果0004的例子。
[0237]在图27所示的显示例中示出了作为判定结果P300通过符号执行判定的情况以及判定为其结果等价的情况。此外,作为用于结构比较的结构图数据,显示实施了正规化后的重构前正规化源代码信息1005的结构图P311和重构后正规化源代码信息1006的结构图P312。在结构图P311和P312中,通过对结构比较的结果判断为差异的节点改变颜色,知道结构比较的结果源代码中的哪个部分判断为不等价。此外,通过观察结构图,知道如何实施了正规化。
[0238]并且,在图27中,作为重构应用信息P320显示应用的正规化重构模式即“示应用的正”,作为对象函数名信息显示baz,作为应用位置信息显示分别对重构应用前后应用了重构的文件名和行编号。由此,开发者能够确认等价性验证装置处理的重构模式以及应用位置是否与想要的结果一致。
[0239]在图27所示的显示例中,作为基于符号执行的判定特有的信息而显示针对重构前的源代码的符号执行一览信息P330以及针对重构后的源代码的符号执行一览信息P331。在符号执行一览信息P330和P331中,分别一行一行显示E30UE351以及E40UE402、E45UE452中的路径制约和变量状态。由此,开发者能够知道符号执行的结果,且能够知道使用哪些逻辑式来判定等价性。并且,由此用户能够判断重构妥当。
[0240]图27所示的显示例是通过符号执行判定为等价的情况的显示例。在通过符号执行判定为非等价的情况下,除了图27所示的信息外,还显示反例信息。反例信息是通过SAT解法得到的、重构前的符号执行一览和重构后的符号执行一览不等价的输入例。通过显示该反例信息,开发者能够知道针对哪些输入进行了针对重构前的源代码和重构后的源代码不同的输出。由此,能够分析成为不恰当的重构的原因。
[0241]在本例子中,产生源代码信息即结构图的构造的差异,因此为了通过S1047的判定验证源代码等价,需要进行符号执行,但进行源代码信息的抽象化、源代码信息的缩减,因此能够削减符号执行的计算量。
[0242]符号说明
[0243]0001重构前源代码
[0244]0002重构后源代码
[0245]0003重构模式
[0246]0004验证结果
[0247]101 CPU
[0248]102主存储装置
[0249]103 网络 I/F
[0250]104 图形 I/F
[0251]105输入输出I/F
[0252]106辅助存储装置I/F
[0253]110控制部
[0254]120显示/输出装置
[0255]130输入装置
[0256]131 键盘
[0257]132 鼠标
[0258]141HDD (Hard Disk Drive:硬盘)
[0259]142DVD驱动装置
[0260]150外部网络
[0261]160外部计算机
[0262]200源代码等价性验证程序
[0263]1000源代码等价性验证装置
[0264]1100 输入部
[0265]1120重构模式登录信息
[0266]1200正规化部
[0267]1300结构比较验证处理部
[0268]1400符号执行验证处理部
[0269]1500 输出部
[0270]1600 存储部
[0271]1601正规化数据库
[0272]1602抽象化数据库
[0273]1603重构前/后源代码存储区域
[0274]1604重构前/后源代码信息存储区域
[0275]1605重构前/后符号执行结果存储区域
[0276]1606验证结果存储区域
[0277]1700符号执行实施判定部
[0278]1001重构前源代码信息
[0279]1002重构后源代码信息
[0280]1003重构模式信息
[0281]1004变更位置信息
[0282]1005重构前正规化源代码信息
[0283]1006重构后正规化源代码信息
[0284]1007a正规化信息
[0285]1007b变更位置确定信息
[0286]1008结构比较结果
[0287]1009符号执行开始指示
[0288]1010抽象化信息
[0289]1101源代码输入部
[0290]1102重构模式输入部
[0291]1201变更位置确定部
[0292]1202源代码正规化部
[0293]1401抽象化部
[0294]1402符号执行部
[0295]1403重构前抽象化源代码信息
[0296]1404重构后抽象化源代码信息
[0297]1405重构前符号执行结果
[0298]1406重构后符号执行结果
[0299]1407符号执行结果比较部
[0300]1601正规化数据库
[0301]1602抽象化数据库
[0302]S101重构前源代码输入步骤
[0303]S102重构后源代码输入步骤
[0304]S103重构模式输入信息输入步骤
[0305]S1041变更位置确定步骤
[0306]S1042源代码正规化步骤
[0307]S1043结构比较步骤
[0308]S1044源代码抽象化步骤
[0309]S1045符号执行步骤
[0310]S1046符号执行结果比较步骤
[0311]S1047符号执行实施判定步骤
[0312]S105等价非等价输出步骤
[0313]C001重构应用前的源代码
[0314]C002重构应用后的源代码
[0315]C003重构应用前的源代码
[0316]C004重构应用后的源代码
[0317]C005 C003中的函数foo内的源代码的前半部分
[0318]C006 C003中的函数foo内的源代码的后半部分
[0319]C007 C004中的函数foo内的源代码的前半部分
[0320]C008 C004中的函数foo内的源代码的后半部分
[0321]C009重构应用前的源代码
[0322]C010重构应用后的源代码
[0323]C011 C009中的函数fool内的源代码的前半部分
[0324]C012 C009中的函数fool内的源代码的后半部分
[0325]C013 C009中的函数foo2内的源代码的前半部分
[0326]C014 C009中的函数foo2内的源代码的后半部分
[0327]C015
当前第5页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1