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

文档序号:9650596阅读:来源:国知局
构图M009,在双方中存在函数foo和函数var,因此没有函数等级的增减,在foo函数的内部中可观察到差异,因此变更位置确定部1201输出foo函数的内部作为变更位置信息1004。另夕卜,在该例子中,作为重构模式是“,作为重,因此不参照正规化DB1601的变更位置确定信息1007b,而仅通过解析结构图的结构来确定变更位置。
[0180]接着,对图5的源代码信息正规化S1042的步骤进行说明。
[0181 ] 在正规化部1200的源代码正规化部1202中,根据变更位置信息1004和重构前源代码信息1001使用正规化DB1601中的对应的正规化信息1007a的正规化方法来进行正规化,生成重构前正规化源代码信息1005。重构后源代码信息1002也同样地进行正规化,生成重构后正规化源代码信息1006。在该重构例子中,从正规化DB1601取得重构模式信息1003与“无符合”对应的正规化信息。在此,重构模式信息1003与“无符合”对应的正规化信息没有变换,因此源代码正规化部1202对重构前源代码信息1001和重构后源代码信息1002不进行任何变更地输出重构前正规化源代码信息1005重构后正规化源代码信息
1006。在正规化部1200没有进行变换,因此重构前正规化源代码信息1005是图16中的结构图M008,重构后正规化源代码信息1006是图16中的结构图M009。
[0182]接着,对图5的构造比较S1043的步骤进行说明。
[0183]在结构比较验证处理部1300中接受重构前正规化源代码信息1005和重构后正规化源代码信息1006,进行源代码信息的结构的比较,生成结构比较结果1008。
[0184]考虑了各种探索多个图结构之间的一致/不一致的方法,例如列举了这样的方法:以从层级的最上位节点开始比较,之后进行其子节点间的比较,进一步其子节点间的比较的方式依次降低层级,进行所有层级的节点间的比较,若在其中途判定为不一致,则判定为两图结构不同。
[0185]在该重构例子中,比较重构前正规化源代码信息1005的图M008与重构后正规化源代码信息1006的结构图M009,在图M009中没有节点“进入foo (entry foo) ”的子节点“a = 0”,因此明确判定为图结构不同,将结构比较结果1008判定为重构前后的源代码非等价。
[0186]接着,对图5的符号执行实施判定步骤S1047进行说明。
[0187]在该重构例子中,作为结构比较结果1008,符号执行实施判定部1700判定为源代码非等价,因此生成符号执行开始指示1009的指令。
[0188]接着,对图5的源代码信息抽象化步骤S1044进行说明。
[0189]在符号执行验证处理部1400接受符号执行开始指示1009时,在抽象化部1401使用变更位置信息1004和抽象化DB1602的记录了抽象化方法的抽象化信息1010进行重构前正规化源代码信息1005和重构后正规化源代码信息1006的抽象化。在抽象化DB1602的抽象化信息1010中与变更位置信息1004对应地记录有恰当的抽象化方法。在该重构例子中,判明变更位置信息1004为函数foo的内部,因此从抽象化DB1602取得抽象化信息1010,其中,该抽象化信息1010记载了在去除了函数foo的源代码中,将在重构前后没有差异的函数变换为变量并抽象化的方法。表示在抽象化部1401将在重构前后没有差异的函数变换为变量并抽象化的方法应用于重构前正规化源代码信息1005的图M008和重构后正规化源代码信息1006的图M009的结果时,成为如图17所示。在图16的重构前正规化源代码信息1005的结构图M008中,节点M010的函数var通过重构没有产生差异,因此与调用函数var的位置的节点M011对应地作为变量v进行抽象化,变换为图17的结构图M014。但是,在该抽象化中,节点M010和其他节点必须没有数据依存性(DataDependency)。关于图16中的重构后正规化源代码信息1006的图M009,同样地进行抽象化而变换为结构图M015。抽象化部1401将上述结构图M014作为重构前抽象化源代码信息1403输出,将上述结构图M015作为重构后抽象化源代码信息1404输出。在此,应注意关于该抽象化,在各个结构图M008、M009中,节点被剪切,在对各个进行了符号执行时计算量减少。
[0190]接着,对图5的符号执行S1045的步骤进行说明。
[0191]在符号执行验证处理部1400中,在抽象化部1401进行了抽象化后,在符号执行部1402分别对重构前抽象化源代码信息1403和重构后抽象化源代码信息1404进行符号执行,作为其结果生成重构前符号执行结果1405和重构后符号执行结果1406。在该重构例子中,在符号执行部1402对上述重构前抽象化源代码信息1403和重构后抽象化源代码信息1404进行了符号执行的结果成为如图18所示。在该重构例子中,重构前抽象化源代码信息1403相当于图17的结构图M014,对结构图M014进行符号执行时,能够得到图18中的执行树E100。此外,图18的执行树E100中的符号执行一览即E101、E102、E103、E104是针对重构前抽象化源代码信息1403的重构前符号执行结果1405。重构后抽象化源代码信息1404相当于图17的结构图M015,对结构图M015进行符号执行时,能够得到图18中的执行树E200。此外,图18的执行树E200中的符号执行一览即E201、E202、E203、E204是针对重构后抽象化源代码信息1404的重构后符号执行结果1406。
[0192]接着,对图5的符号执行结果比较S1046的步骤进行说明。
[0193]在符号执行验证处理部1400的符号执行结果比较部1407中比较重构前符号执行结果1405和重构后符号执行结果1406是否逻辑上等价,进行重构前后的源代码等价还是非等价的判定。在图15的重构例子中,重构前符号执行结果1405是E101、E102、E103、E104,重构后符号执行结果1406是E201、E202、E203、E204。按以下方式判定这些两个符号执行结果逻辑上等价。
[0194]作为表示重构前的符号执行一览的逻辑式,取E101的路径制约和变量状态的逻辑积、E102的路径制约变量状态的逻辑积、E103的路径制约和变量状态的逻辑积、E104的路径制约变量状态的逻辑积这4个逻辑式的逻辑和。S卩,((β <0)AND(y <0)AND(a=-y)AND(b = 0)AND(v = y))OR((0 < 0) AND (NOT (γ < 0)) AND (a = y)AND(b = 0)AND(v = y))OR((NOT(0 < 0))AND(y < 0)AND(a = β — y)AND(b = β )AND(v = γ))OR((NOT(0 < 0)) AND (NOT (γ < 0)) AND (a = β + y)AND(b = β )AND(v = γ))是表现重构前的符号执行一览的逻辑式。作为表示重构后的符号执行一览的逻辑式,取Ε201的路径制约和变量状态的逻辑积、Ε202的路径制约和变量状态的逻辑积、Ε203的路径制约和变量状态的逻辑积、Ε204的路径制约和变量状态的逻辑积这4个逻辑式的逻辑和。方便起见,将重构后的输出变量a、b、v的值分别设为a’,b’,v’时,表现重构后的符号执行一览的逻辑式为((β < 0)AND(y <0)AND(a’ =— y)AND(b’ =0)AND(v’ = y))OR((0 < 0)AND (NOT ( γ <0))AND(a’= γ ) AND (b,= 0) AND (v,= y))OR((NOT(0 < 0))AND(y < 0)AND(a’= β — y)AND(b,= β)ΑΝ?(ν,= y))OR((NOT(0 < 0)) AND (NOT ( γ < 0)) AND (a,=0 + y)AND(b,= 0)AND(v,= γ))。
[0195]判定表现重构前的符号执行一览的逻辑式和表现重构后的符号执行一览的逻辑式在逻辑上是否等价。
[0196]在该判定方法中,在表现上述重构前的符号执行一览的逻辑式和表现重构后的符号执行一览的逻辑式分别包含的符号变量的值相同的情况下,只要验证输出变量的值相等即可。关于这点,可以通过SAT解法解决针对表现重构前符号执行一览的逻辑式、表现重构后符号执行一览的逻辑式以及逻辑式NOT ((a = a’)AND (b = b’)AND (v = v’))的逻辑积的式的充分可能性问题来实现。若通过SAT解法解决的结果为不可能充分,则在赋予相同输入值的情况下,可知在重构前和重构后不可能得到不同的输出值,因此判定为逻辑上等价。在可能充分的情况下,表示存在对相同输入值在重构前和重构后得到不同值的情况。此时,使用SAT解法输出的可能充分的值的例子,能够得到非等价的输入值的例子(反例)。在此使用的SAT解法使用一般提供的程序。
[0197]在该例子中,能够得到两者的逻辑式等价的结果。该结果也可以分别从E101和E201的对、E102和E202的对、E103和E203的对、E104和E204的对的路径制约和变量状态一致中获知。
[0198]符号执行结果比较部1407将通过SAT解法得到的等价的判定发送给输出部1500。此时,在重构前的符号执行树E100和重构后的符号执行树E200之间产生结构上的差异,但符号执行的最终的符号执行一览逻辑上一致,因此判定为源代码等价。
[0199]接着,对图5的等价非等价输出S105的步骤进行说明。
[0200]输出部1500接受符号执行结果比较部1407判定为源代码等价的结果后,作为验证结果0004输出源代码等价。图20表示输出部1500输出的验证结果0004的例子。
[0201]在图20所示的显示例中示出了作为判定结果P200通过符号执行判定的情况以及判定为该结果等价的情况。此外,作为在结构比较中使用的结构图数据,显示实施了正规化后的重构前正规化源代码信息的结构图P211和重构后正规化源代码信息的结构图P212。并且,作为重构应用信息P220显示所应用的正规化重构模式为“化重构模。在结构图P211和P212中,通过对结构比较的结果判断为差异的节点改变颜色,知道结构比较的结果源代码中的哪个部分被判断为不等价。此外,通过比较显示结构图,知道如何实施了抽象化。
[0202]在图20所示的显示例中,作为基于符号执行的判定特有的信息显示针对重构前的源代码的符号执行一览信息P230以及针对重构后的源代码的符号执行一览信息P231。在符号执行一览信息P230和P231中,分别逐行显示E101、E102、E103、E104以及E201、E202、E203、E204中的路径制约和变量状态。由此,开发者能够知道符号执行的结果,且能够知道使用哪些逻辑式对等价性进行了判定。并且,由此用户能够判断重构妥当。
[0203]图20所示的显示例是通过符号执行判定为等价的情况的显示例。在通过符号执行判定为非等价的情况下,除了图20所示的信息外,还显示反例信息。反例信息是通过SAT解法得到的、重构前的符号执行一览和重构后的符号执行一览不等价的输入例。通过显示该反例信息,开发者能够知道针对哪些输入进行了重构前的源代码和重构后的源代码不同的输出。由此,能够分析成为不恰当的重构的原因。
[0204]在本例子中,通过符号执行实施判定S1047的判定确认作为源代码信息的结构图上的结构的差异,因此为了验证源代码等价而实施符号执行。通过进行源代码信息的抽象化、源代码信息的缩减,在符号执行处理中能够削减符号执行的计算量。
[0205]实施例4
[0206]以下,参照上述图5,使用图21至图27,对本发明一实施方式的源代码等价性验证装置的处理的具体例进行说明。该例子通过图5的符号执行实施判定S1047的处理,在被实施了与登录的重构模式对应的重构的源代码中,判定源代码信息即结构图的结构不一致。
[0207]图21是表示重构前后的源代码的例子的图(之三)。
[0208]图22是表示与重构前的源代码对应的源代码信息的例子的图(之三)。
[0209]图23是表示与重构后的源代码对应的源代码信息的例子的图(之三)。
[0210]图24是表示正规化后的重构后的源代码信息的例子的图。
[0211]图25是表示抽象化后的源代码信息的例子的图。
[0212]图26是表示被抽象化时的、针对重构前源代码和重构后源代码进行了符号执行时的执行树的例子。
[0213]图27是表示被抽象化时的、基于显示部的等价性验证结果的显示例的图。
[0214]在该例子中,作为针对源代码的重构,说明根据重构模式参数化方法(Parameterized Method)进行了重构的情况。重构模式参数化方法是在多个位置进行相似处理的源代码中,将该相似处理作为函数来提取,将在多个位置进行相似处理的位置置换为所提取的函数的调用,对存在于多个位置的相似源代码进行共有化的重构模式。
[0215]两者的不同点在于,在上述的提取方法中假定了提取相同处理,但参数化方法假定了提取类似但不相同的处理。在参数化方法中,在实现类似但不相同的处理的提取时,在所提取的函数中接受表示处理的差异的种类的自变量,通过针对该自变量的条件分支实现差异。在所提取的位置中附带表示差异的自变量调用所提取的函数,来吸收处理的差异。
[0216]在图21中示出了重构前的源代码C009和重构后的源代码C010。源代码C009是重构模式参数化方法的应用前的源代码,函数fool由将全局变量a和全局变量b相加后代入到全局变量c,并以全局变量c为自变量调用函数bar的C011部分和以全局变量c为自变量调用函数quxl的C012部分构成,函数foo2由将全局变量a和全局变量b相减后带入到全局变量c,并以全局变量c为自变量调用函数bar的C013部分和以全局变量c为自变量调用函数qux2的C014部分构成。源代码C010是重构模式参数化方法应用后的源代码,将源代码C009中的函数fool内的处理的一部分即C011的位置和类似的函数foo2内的处理的一部分即C013的位置作为函数baz来提取,在与所提取的位置对应的位置即C015和C015中置换为向函数baz的调用。在所提取的函数baz中,在C019所示的处理部分通过针对取真假值的自变量的条件分支分配函数fool的C011和函数foo2的C013的差异即全局变量a和全局变量b的相加处理和相减处理而对应。
[0217]说明图21所示的重构例子中的、图5的重构前源代码输入S101和重构后源代码输入S102。在该重构的例子中,重构前源代码0001对应于源代码C009,重构后源代码0002对应于源代码C010。在输入部1100中,通过源代码输入部1101接受重构前源代码0001和重构后源代码0002来生成对应的重构前源代码信息1001和重构后源代码信息1002。
[0218]在图21的重构例子中,源代码输入部1101接受源代码C009作为重构前源代码0001,进行字句解析和句法解析,作为重构前源代码信息1001变换为图22的结构图M017。此外,源代码输入部1101接受源代码C010作为重构后源代码0002,进行字句解析和句法解析,作为重构后源代码信息1002变换为图23的结构图M018。在此,重构前源代码信息1001对应于结构图M017,重构后源代码信息1002对应于结构图M018。
[0219]接着,对输入与重构模式相关的信息的S103的步骤进行说明。
[0220]在输入部1100中,在重
当前第4页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1