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

文档序号:9650596阅读:291来源:国知局
源代码等价性验证装置以及源代码等价性验证方法
【技术领域】
[0001]本发明涉及一种源代码等价性验证装置以及源代码等价性验证方法,尤其涉及一种在软件重构中为了防止因重构实施导致的不良混入,在通过符号执行方法验证作为程序的动作等价的情况下,用于防止计算量的爆发式增加,迅速验证重构的正当性的优选的源代码等价性验证装置以及源代码等价性验证方法。
【背景技术】
[0002]近年来,随着信息处理社会发展,软件系统浸透到一般社会,对于软件要求的可靠性成为非常高的问题。另一方面,软件随着常年的差异/派生开发而踏上复杂化且大规模化的方向,软件的易扩展性或易理解性等维护性下降成为问题。
[0003]重构是在非专利文献1至3中所公开的方法,通过不改变软件的动作地变更内部结构来改善软件的设计品质的方法的总称,是减轻复杂度提高维护性的方法。该重构的方法是对于确保踏上复杂化以及大规模化的方向的软件的维护性有希望的技术,但由于变更源代码,因此存在新混入不良的可能性。具体而言,在重构中存在被分类为多个模式的方法,明示或暗示地决定各源代码的变更顺序以及针对用于保证通过该变更不会改变软件的动作的源代码的条件。在不按照该变更顺序地变更了源代码的情况下,或者,变更了不遵从这样的条件的源代码的情况下,不保证不改变成为对象的软件动作,因此有可能在软件中混入不良。因此,软件开发者在软件的维护阶段,有担心因重构原因而在准确地动作的软件中混入不良,而做出不进行重构的判断的可能性。因此,在软件的维护阶段,为了积极地进行重构,要求验证没有由重构导致的不良的混入的方法。
[0004]在非专利文献3中,定义了 72种典型使用的重构模式(以下,简单称为“重构模式”)。
[0005]在本说明书中,将两个源代码外在的动作相同,即针对相同输入在执行时得到相同输出定义为两个源代码“等价”,将验证重构实施前的源代码和重构实施后的源代码等价称为“等价性验证”。
[0006]作为验证重构实施前的源代码和重构实施后的源代码等价的方法所要求的条件,有如下的条件。
[0007](1) 一个条件是其作业的大部分被自动化,基于人工的作业较少。以往,通过基于人工的评价或测试来验证源代码的等价性。通过对其实现基于工具的自动性验证,削减验证用时,促进重构。
[0008](2)另一个条件是通过重构验证方法判断为动作等价或非等价的情况下,向开发者提示成为其根据的信息。通过向开发者提示易懂的成为判定基准的信息,开发者自身能够进行再验证,针对工具的可靠性提高,促进重构。
[0009]作为等价性验证的方法,有:通过专利文献1公开的源代码比较,对产生差异的部分实施测试,比较其结果的方法;通过图表表现非专利文献1公开的源代码,每次重构时验证图表否满足所决定的事先条件的方法;以及使用非专利文献2公开的符号执行,来验证动作被保持的方法。
[0010]现有技术文献
[0011]专利文献
[0012]专利文献1:美国专利申请公开第2007/0033576号说明书
[0013]非专利文献
[0014]非专利文献1:T.Mens, S.Demeyer, D.Janssens, "Formalising Behav1ur Preserving Program Transformat1ns^, Proceedings of the First Internat1nal Conferenceon Graph Transformat1n, USA,2002
[0015]非专利文献2:S.Person, Μ.B.Dwyer, S.Elbaum, C.S.Pasareanu, "Differential Symbolic Execut1n", Proc.0f ACM SIGS0FT Symposium on the Foundat1ns of SoftwareEngineering 2008, USA,2008
[0016]非专利文献3:M.Fowler et al.,“Refactoring:1mproving the Design of Existing Code,,,USA, Addison-Wesley Profess1nal, ledit1n, July 8, 1999

【发明内容】

[0017]发明要解决的课题
[0018]在非专利文献1中公开了如下的方法:用图表表现程序的方法调用关系,每次重构时验证是否满足所决定的事先条件。在该方法中,通过结构上的验证实现动作的验证,因此每次重构时,严密地定义其操作后收罗不会对动作产生影响的条件。因此,事实上,存在必须通过工具使重构自动化,不能用于通过可能错误进行重构操作其本身的人工的重构验证的问题。
[0019]在专利文献1中公开了通过使用符号执行,生成针对成为对象的源代码的测试用例的方法。并且,在专利文献1中公开了使用不同的抽象度来抑制符号执行的计算量的爆发并生成测试用例的方法。为了将这些方法应用于重构前后的等价性验证,生成与重构前和重构后的源代码相关的测试,实施对各源代码生成的测试,验证它们的结果。这些在实施重构时不需要特别的过程,但存在几个问题。根据重构位置影响波及范围较广,仅通过所生成的测试还存在无法完全验证等价性的可能性。此外,即使是没有影响的波及的仅差异部分的验证,也存在因测试的覆盖率产生验证遗漏等可能性。此外,基于测试的等价性验证有验证遗漏等可能性,因此不完全。此外,作为等价性的判断根据,对开发者提示所实施的测试用例。但是,存在仅通过测试用例的举例,开发者无法判断这些是否是充分的测试用例的问题。
[0020]在非专利文献2中,作为对重构前后的源代码进行等价性验证的技术,公开了使用符号执行的方法。
[0021]符号执行是作为对象的程序输入,代替赋予数值,而通过赋予符号来网罗解析程序的动作的方法。
[0022]以下,使用图19说明符号执行的一例。
[0023]图19是为了说明符号执行的一例,表示源代码和由此派生的数据结构的图。
[0024]在符号执行中,使用被称为符号变量的符号来表现输入变量的值,解析该符号变量在程序中如何被参照/更新。在此,以记载于用C语言记述的源代码E001中的函数foo为对象实施符号执行。在对成为符号执行的对象的源代码E001进行符号执行时,首先,与对通常的源代码进行编译时同样地,实施字句解析或句法解析。根据该结果得到从源代码E001提取了控制流程或控制依存图、数据依存图等的结构图E002。在符号执行中,使用结构图E002来生成执行树E020。执行树E020中的各节点由通过用于达到该节点的符号变量所表现的路径制约和通过符号变量变现了该节点中的各变量的值的变量状态构成。在图19的执行树E020中,在各节点的上侧表现路径制约,在下侧表现变量状态。
[0025]以下,详细说明执行树E020的生成过程。
[0026]在符号执行的开始阶段,在源代码E001中,对成为程序的输入的变量分配符号变量。在源代码E001的例子中,全局变量a、b、c是成为输入的变量,因此分别对它们分配α、β、Τ这样的符号变量。在结构图Ε002上,在与节点Ε003对应的开始状态,执行树Ε020是仅由单一的节点Ε010构成的执行树。节点Ε010的路径制约EOlOa成为表示无制约(对任意的变量状态满足制约)的真(true),变量状态EOlOb按照符号变量的分配表示与各变量对应的符号变量相等。
[0027]在结构图E002上,接着节点E003执行节点E004。与之相伴,在执行树中也生成E010的子节点E011。关于子节点E011中的路径制约EOlla以及变量状态EOllb,复制母节点E010的路径制约EOlOa以及变量状态EOlOb后,执行结构图E002上的节点E004。
[0028]在节点E004中,对变量a代入0。因此,将针对执行树的节点E011的变量状态EOllb中的变量a的状态更新为a = 0。
[0029]在结构图E002上,接着节点E004执行的是节点E005。在节点E005中,没有进行变量状态的更新,因此不生成执行树中的新节点。节点E005是基于若(if)文的条件分支。因此,在结构图E002的控制流程中成为下个的节点是节点E006和节点E007这两个节点。在符号执行中,为了网罗所有能够取得的控制流程,在条件分支中,生成与各个分支对应的子节点。即,与节点E006对应地生成E012作为执行树中的节点E011的子节点,与节点E007对应地生成E013作为执行树中的节点E011的子节点。
[0030]执行树的节点E012的路径制约E012a成为母节点的路径制约EOlla和条件分支的分支条件的逻辑积(AND,在图中为&)。节点E00中的分支条件为。< 0,此外,从变量状态EOllb,如果用符号变量表不变量c,则成为γ,由此可知用于使条件分支成立的条件为γ< 0。因此,真(rrue)和γ < 0的逻辑积即γ < 0成为节点Ε012中的路径制约E012a。
[0031]接着,子节点E013的路径制约E013a,与在E013的条件分支的分支条件不成立的情况下对应,因此成为母节点的路径制约EOlla和条件分支的分支条件的否定(NOT (逻辑非),在图中为!)的逻辑积。即,真(true)和! (γ < 0)的逻辑积即! (γ < 0)成为子节点Ε013的路径制约E013a。
[0032]关于节点E011的子节点E012的变量状态E012b、子节点E013的变量状态E013b,在复制母节点E011的变量状态EOllb后继续进行计算。关于节点E012的变量状态E012b,在节点E006向变量c代入0,因此针对c的变量状态被更新为c = 0。关于节点E013的变量状态E013b,在节点E007向变量a代入变量c的值。在该时间点,变量c的变量状态成为符号变量的γ,因此在变量状态E013b,变量a的变量状态被更新为a = γ。
[0033]之后也按照与上述同样的顺序生成执行树。在控制流程中,接着节点Ε006的节点是Ε008,该Ε008为条件分支,因此在执行树对节点Ε012生成两个子节点Ε014和Ε015。节点E008中的分支条件为(b < 0),但使用变量状态E012b以符号变量表现他们时成为(β
<0)。因此,子节点Ε014和Ε015的路径制约成为针对母节点Ε012的路径制约E012a分别取(β < 0)和! (β < 0)的逻辑积。在子节点Ε014中,接着执行控制流程上的节点E009a。节点E009a是向变量a代入a — b的的值而得的节点,根据变量状态可知变量a的状态为0,变量b的状态为β,因此将变量a的状态更新为一 β。在子节点Ε015中,接着执行控制流程上的节点E009b。E009b是向变量a代入a+b的值而得的节点,根据变量状态可知变量a的状态为0,变量b的状态为β,因此将变量a的状态更新为β。
[0034]在控制流程中,接着节点Ε007的节点是Ε008,该Ε008为条件分支,因此在执行树中对节点Ε013生成两个子节点Ε016和Ε017。节点Ε008中的分支条件为(b < 0),但使用变量状态E013b以符号变量表现他们时成为(β < 0)。因此,子节点Ε016和Ε017的路径制约为分别对母节点Ε013的路径制约E013a取(β < 0)和! ( β < 0)的逻辑积。在子节点Ε016中,接着执行控制流程上的节点E009a。E009a是向变量a代入a — b的值而得到节点,根据变量状态可知变量a的状态为γ,变量b的状态为β,因此将变量a的状态更新为γ — β。在子节点Ε017中,接着执行控制流程上的节点E009b。E009b是向变量a代入a+b的值而得到的节点,根据变量状态可知变量a的状态为γ,变量b的状态为β,因此将变量a的状态更新为γ + β。
[0035]对于执行树Ε020的所有叶节点,其控制流程到达函数结束时,结束执行树的生成。图19的执行树Ε020表示针对函数foo的符号执行结束的时间点的执行树。收集符号执行结束的时间点的执行树的各叶节点而成为符号执行的结果(这些被称为“成为符号一览”)。符号变量α、β、γ的任意的组合满足符号执行一览中的各叶节点中的任意路径制约。通过使用该节点所包含的变量状态,能够从成为输入的符号变量的值知道程序执行后的各变量的值。例如,在函数foo执行前的变量a、b、c的值都是1的情况下,符号变量成为α = β = γ = 1,满足节点Ε017的路径制约。从节点Ε017的变量状态可知函数foo执行后的变量a的值成为a=y + P =2、b=0 = U c = γ = Ιο如上所述,符号执行是在网罗程序能够取得的控制路径基础上,能够求出以程序执行前后的变量值的关系为输入值的条件(路径制约)和输出变量的状态(变量状态)的组的集合即符号执行一览的计笪并ο
[0036]针对重构前后的源代码的结构图,分别进行符号执行,在得到逻辑上等价的符号执行一览时,即在针对相同输入得到相同输出的情况下,如以上定义的那样,能够判定为源代码等价。这样,符号执行因为网罗性地解析对象的程序的能够取得的动作系列,因此不会产生使用了测试的验证中的覆盖率问题或事先条件的验证中的工具依存问题。另一方面,在具有重复文或递归结构的程序中,执行树变得复杂,计算量容易发散爆发。为了抑制计算量,需要限定符号执行的范围或限制基于事先条件的执行,失去符号执行的优点即验证的完全性。
[0037]在非专利文献2中,着眼于在要比较的源代码之间存在共有部分这一点,在维持完全性的状态下试图减少计算量。通过函数(uninterrupted funct1n,不中断函数)表现没有变更的共有的程序段的执行结果,由此防止执行树上的计算量的发散。然而,依然存在差异部分的执行树上的计算量发散的用例,存在计算量爆发的可能性。此外,也没有提及与硬件等外界具有相互作用的程序的处理。
[0038]本发明是为了解决上述问题点而提出的,其目的是提供一种通过符号执行进行针对人工实施的重构的等价性验证时,不使计算量爆发,而能够迅速地进行的源代码等价性验证方法。
[0039]用于解决课题的手段
[0040]为了解决上述课题,在本发明中,提供一种验证最初的源代码和重构实施后的源代码的等价性的源代码等价性验证装置,使该源代码等价性验证装置构成为具有如下单元:源代码输入单元,其输入重构前的源代码和重构后的源代码;重构模式输入单元,其输入所述源代码的重构模式信息;源代码信息生成单元,其进行所述重构前的源代码和所述重构后的源代码各自的字句解析/句法解析,并变换为结构图,生成重构前源代码信息和重构后源代码信息;正规化单元,其参照对重构模式信息定义的正规化信息,对所述重构前源代码信息和所述重构后源代码信息进行正规化,分别生成重构前正规化源代码信息和重构后正规化源代码信息;结构比较单元,其比较所述重构前正规化源代码信息和所述重构后正规化源代码信息的结构;符号执行单元,其对所述重构前正规化源代码信息和所述重构后正规化源代码信息进行符号执行;以及等价性判定单元,其比较基于所述符号执行单元的符号执行的结果,来判定所述重构前源代码和所述重构后源代码的等价性。
[0041]此外,为了解决上述课题,在本发明中,在所述源代码等价性验证装置中,所述结构比较单元比较所述重构前正规化源代码信息和所述重构后正规化源代码信息的结构图,在判定为结构一致的情况下,判定所述重构前源代码和所述重构后源代码等价,结束等价性验证处理,在判定为所述结构不一致的情况下,向所述符号执行单元的处理转移。
[0042]此外,为了解决上述课题,在本发明中,在所述源代码等价性验证装置中,所述正规
当前第1页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1