基于程序执行轨迹的过程间动态程序切片系统的制作方法

文档序号:6637278阅读:293来源:国知局
基于程序执行轨迹的过程间动态程序切片系统的制作方法
【专利摘要】本发明涉及一种基于程序执行轨迹的过程间动态程序切片系统,具体方法依据以下五步进行:轨迹分析,首先利用调试器的信息记录程序执行轨迹,找出该次执行中涉及的类和方法;类层次分析,对涉及的类建立类层次图;程序调用分析,在类层次图的基础上建立计算方法的调用信息;控制依赖分析,同时计算涉及方法的控制依赖;程序切片,根据求得的所有信息计算得到程序切片,该系统大大提高了算法的效率,根据调用关系、控制依赖关系提高了切片的精度。根据调用关系,过程间信息的传递称为可能,从而可以对程序进行过程间动态程序切片。
【专利说明】基于程序执行轨迹的过程间动态程序切片系统

【技术领域】
[0001]本发明涉及一种用于软件调试和系统维护过程中的程序分析和理解的方法,具体涉及一种基于程序执行轨迹的过程间动态程序切片系统。

【背景技术】
[0002]随着软件规模的日益增大,传统的调试技术难以有效地处理大型复杂的软件系统。大型软件系统通常包含数百万行的代码,程序开发人员往往无法快速理解程序中代码,这给程序的调试和维护工作带来了很大的困难。程序切片是一种程序分解技术,可以将程序分解成若干片段,帮助开发人员从中识别感兴趣的部分。其概念和原理由M.Weiser于1979首次建立。使用程序切片技术,可以降低程序分析和理解的难度,提高程序测试和调试工作的速率,缩短程序开发和维护的时间。
[0003]根据切片的范围,可以将切片分为过程内切片和过程间切片。过程内切片是指单个过程中影响兴趣点变量值(或受兴趣点变量的值影响)的语句集合,不考虑过程调用的情况;过程间切片在过程内切片的基础上,考虑过程调用的情况。进行过程间切片时,需要建立实参和形参相对应的依赖关系,完成实参和形参之间依赖性的转换。在实际的程序调试过程中,软件系统往往含有大量的过程调用,简单的过程内切片已经不能满足程序调试的需要,因此,分析过程间语句的依赖关系来实现过程间切片十分重要。
[0004]根据切片过程对程序某一次具体的输入的依赖程度,可以将程序切片分为静态切片和动态切片。静态切片是指不考虑程序运行时的输入,完全利用静态分析方法得到切片,即通过分析程序的源代码,计算所有可能输入情况下的程序切片。静态切片考虑了程序中所有的执行路径,包含了所有与兴趣点处变量相关的语句,而不管某些语句在程序实际的执行中是否被执行。因此,静态切片具有很大的冗余性。动态切片是指在特定输入下实际影响兴趣点变量值(或受兴趣点变量值影响)的所有语句的集合。动态切片只考虑程序在某个具体输入下,实际执行的路径中,和兴趣点变量相关的语句。因此,动态切片的计算过程依赖于程序的具体输入,每一次的计算工作量较小,得到的切片相对比较精确。但是,计算动态切片需要保存大量的中间信息,时间复杂度和空间复杂度较高。因此动态切片的算法优化是一个很重要的问题。


【发明内容】

[0005]为了优化动态程序切片算法的效率,提高程序切片的精度,同时能够处理含有过程调用的程序,本发明提供了一种基于程序执行轨迹的过程间动态程序切片系统。该系统利用调试器记录程序的轨迹信息,在此基础上计算程序的类层次图、程序调用图,并计算程序的控制依赖信息从而得到程序切片。
[0006]本发明是通过以下技术方案实现的:一种基于程序执行轨迹的过程间动态程序切片系统,本系统使用eclipse进行开发,依据程序动态执行轨迹进行Java过程间动态程序切片,具体方法依据以下五步进行:
[0007]步骤I)轨迹分析TraceAnalysis,首先利用调试器的信息记录程序执行轨迹,找出该次执行中涉及的类和方法;
[0008]步骤2)类层次分析Hierarchy Analysis,对涉及的类建立类层次图;
[0009]步骤3)程序调用分析Call Analysis,在类层次图的基础上建立计算方法的调用信息;
[0010]步骤4)控制依赖分析Control Dependence Analysis,同时计算涉及方法的控制依赖;
[0011]步骤5)程序切片Slice,根据求得的所有信息计算得到程序切片。
[0012]本发明的有益效果是:一种基于程序执行轨迹的过程间动态程序切片系统,不需要对程序进行回溯,只需对程序执行过程中涉及的类建立类层次图,且只需对程序执行过程中涉及的方法计算调用关系和控制依赖关系,大大提高了算法的效率,根据调用关系、控制依赖关系提高了切片的精度。根据调用关系,过程间信息的传递称为可能,从而可以对程序进行过程间动态程序切片。

【专利附图】

【附图说明】
[0013]下面结合附图及实施例对本发明作进一步说明。
[0014]图1为轨迹分析TraceAnalysis结构流程图;
[0015]图2为事件处理EventHandle结构流程图;
[0016]图3为类层次分析Hierarchy Analysis结构流程图;
[0017]图4为程序调用分析Call Analysis结构流程图;
[0018]图5为VirtualInvoke分析流程图;
[0019]图6为InterfaceInvoke分析结构流程图;
[0020]图7为控制依赖分析Control Dependence Analysis结构流程图;
[0021]图8为后必经树生成控制依赖(PDT2CD)结构流程图;
[0022]图9为程序切片(Slice)结构流程图。
[0023]具体实施步骤
[0024]一.轨迹分析TraceAnalysis,系统首先要获得程序在一次输入下的轨迹信息,包括轨迹Trace以及应用类集appClasses和应用方法集appClasses and appMethods。
[0025]轨迹Trace是一个键值对集合Collect1n〈Seq, TraceNode),记录程序的执行过程。Seq是执行序号,表示TraceNode产生的顺序。TraceNode是轨迹节点,记录程序每一步的执行情况。依据执行情况的不同,TraceNode的类型分为三种,分别是NormalTraceNode、MethodEntryTraceNode 和 MethodExitTraceNode。三种 TraceNode 记录的信息在下文中将会详细交代。每一个Seq对应一个TraceNode。
[0026]应用类集appClasses和应用方法集appClasses and appMethods是程序在执行过程中实际使用的类和方法。应用类集appClasses包括的信息为程序执行时使用的类的类名(包括包名),应用方法集appMethods包括的信息为程序执行时使用的方法的详细信息Methodlnfo,如方法名、方法参数信息、方法返回值信息等等。
[0027]结合图1所示,轨迹分析TraceAnalysis的具体方法为:
[0028]启动系统,获得目标虚拟机连接器Connector ;—般而言,Connector有共享内存连接器ShareMemoryConnector和套接字连接器SocketConnector两种;不同的Java开发工具包JDK含有其中的一种或两种;
[0029]选择一种Connector, ShareMemoryConnector优先,设置共享地址后进入监听状态,等待目标虚拟机TargetVM执行;
[0030]Connector监听到TargetVM启动后,立刻与TargetVM连接,获得目标虚拟机镜像TargetVM Mirror,以下简称 Mirror,此时,Java Debugger 就可以通过 Mirror 对 TargetVM进行操纵;
[0031 ] 为了获得程序的轨迹/[目息,需要对目标虚拟机进行事件请求EventRequest设置,包括 ThreadStartRequest> ClassPrepareRequest> MethodEntryRequest>MethodExitRequest等等;完成事件请求配置后,系统控制目标程序开始执行,并对程序执行产生的事件进行处理。
[0032]结合图2所示,程序在执行过程中不停的产生事件,系统对其中部分事件进行分析处理,以求获得完整的轨迹信息。当生成的事件为ThreadStartEvent时,系统设置该目标程序单步执行setStepRequest ;当生成的事件为MethodEntryEvent时,表示程序进入一个方法,此时,获得被进入的方法的信息Methodlnfo,生成MethodEntryTraceNode,添加到Trace中;当生成的事件为MethodExitEvent时,表示程序离开一个方法,此时,获得离开的方法的信息Methodlnfo,生成MethodExitTraceNode,添加到Trace中;当生成的事件为StepEvent时,获取当前准备执行语句的节点信息Nodelnfo,包括类名、方法名、行号,生成NormalTraceNode,添加到Trace中;同时,根据切片准则,判断是否到达切片处,如果没有到达,继续进行事件处理,否则,结束TraceAnalysis,获得轨迹信息;当生成事件为VMDisconnectEvent时,表示系统与TargetVM断开连接,系统进行结束处理。事件生成时,系统设置目标虚拟机挂起产生事件的线程。当完成对应事件的处理后,线程恢复继续执行。
[0033]二.类层次分析Hierarchy Analysis,完成轨迹分析后,得到程序在一次输入下的应用类集appClasses,该模块建立appClasses的类层次图HierarchyGraph。
[0034]准确的说,类层次图HierarchyGraph是森林,记录了 appClasses之间的继承关系,森林中的每一棵树是具有同一父类的类的集合,其中根节点是树中所有节点的父类,父节点是子节点的父类,子节点是父节点的派生类。HierarchyGraph中的节点是类名,边表示类的继承关系。
[0035]如图3所示,类层次分析Hierarchy Analysis的具体方法为:首先初始化HierarchyGraph,为HierarchyGraph添加节点,每个节点为appClass。遍历HierarchyGraph,对每一个节点appClass,在appClasses中查找它的父类superclass和接口集合 interfaces,并在 HierarchyGraph 中添加从 appClass 到 superclass 和 interfaces的继承边。遍历HierarchyGraph完成,HierarchyGraph建立完成。
[0036]三.程序调用分析Call Analysis,完成类层次分析后,得到程序在一次输入下使用的类appClasses的类层次图HierarchyGraph。该模块在HierarchyGraph的基础上生成应用方法集appMethods的调用信息Calllnfo。该模块是过程间程序分析中重要的部分,方法与方法之间一般通过调用产生联系。
[0037]调用图CallInfo记录程序的调用关系,它由两个键值对集合组成,分别是caller2callsites 和 callee2callsites。caller2callsites 记录了调用方法 caller 对应的调用信息集合,callee2callsites记录了被调用方法callee对应的调用信息集合。调用息CallSite记录了调用点、调用方法和被调用方法。
[0038]如图4所示,程序调用分析Call Analysis的具体方法为:获取每一个应用方法appMethod,获取它的语句集合stmts。获取每一条语句stmt,判断其是否包含程序调用。如果没有包含程序调用,选取下一条语句。如果包含程序调用,则根据调用的类型分别进行处理。
[0039]程序调用分为四种类型,分别是Staticlnvoke、SpecialInvoke> VirtualInvoke和Interfacelnvoke。当Invoke为Staticlnvoke时,表示调用类方法,调用点与被调用方法可以明确对应,建立调用信息CalISite。当Invoke为SpecialInvoke时,表示调用私有方法、超类方法或实例初始化方法,调用点与被调用方法可以明确对应,建立调用信息CallSite。当Invoke为VirtualInvoke时,表示调用类实例方法。当Invoke为Interfacelnvoke时,表示调用接口方法。后两种调用的调用点与被调用方法此时不能明确对应,需在程序执行时确定。此时进行进一步处理,缩小调用点与被调用方法动态对应时的查找范围。
[0040]如图5所示,当Invoke为VirtualInvoke时,首先找到调用Invoke的引用refdasso此时,invoke调用了 refClass和所有继承自refClass的类中对应方法的一个,因此,需要建立调用点与所有这些方法的调用信息CallSite。继承关系可以从Hierarchy中查找到。因为Hierarchy是appClasses的类层次关系,因此,继承refClass的类的范围本身是缩小的。
[0041]如图6所示,当Invoke为Interfacelnvoke时,首先找到调用Invoke的接口interface。此时,invoke调用了所有继承自interface的类中对应方法的一个,因此,需要建立调用点与所有这些方法的调用信息CallSite。
[0042]四.控制依赖分析ControlDependence Analysis,完成轨迹分析Trace Analysis后,系统得到程序在一次输入下的应用方法集appMethods。该模块计算appMethods中的每一个应用方法appMethod的控制依赖ControlDependence,以下简称CD。
[0043]控制依赖用于表示由于控制流引起的程序实体之间的关系,它的定义如下:令G是一个控制流图,nl和π2是G中的节点,若下列三个条件满足,则n2控制依赖nl,记为CD (n2,nl)。
[0044]I)从n2到nl之间存在一条可执行路径P ;
[0045]2)对P上除nl,n2外的每个节点n,节点n2都是它的后必经节点;
[0046]3)节点n2不是节点η I的后必经节点。
[0047]如图7所示,控制依赖分析Control Dependence Analysis的具体方法为:取出appMethods中的每一个方法appMethod,分析生成方法的控制流图Control Flow Graph,以下简称CFG。对CFG取逆,得到appMethod的逆控制流图1nverseCFG。通过对inverseCFG进行支配关系分析,得到appMethod的后必经树Post-Dominated Tree,以下简称F1DT15
[0048]如图8所示,由后必经树PDT生成控制依赖⑶的方法为:首先获取控制流图CFG中符合特定条件的边的集合Collect1n (A,B),特定条件为PDT中B不是A的祖先。然后取出每一条特定边(A,B),计算A和B的共同祖先L。如果L是A,则查找所有TOT中从A到B路径上的点Nodes,包括A但不包括B,记录Nodes到A的控制依赖关系。否则,查找所有PDT中从L到B路径上的点Nodes,包括B但不包括L,记录Nodes到A的控制依赖关系。所有的边处理完成后,方法的控制依赖求解完毕。
[0049]五.程序切片Slice,完成轨迹分析Trace Analysis后,系统获得了程序的轨迹信息;完成程序调用分析Call Analysis后,系统获得了程序的调用信息CallInfo ;完成控制依赖分析后Control Dependence Analysis后,系统获得了程序各个方法的控制依赖⑶。该模块在前面各个模块分析的基础上完成基于程序执行轨迹的过程间动态程序切片功能。该模块是系统的核心模块。
[0050]如图9所示,程序切片Slice的具体方法为:取出轨迹中的每一个节点TraceNode,判断其类型。当TraceNode类型为MethodEntryTraceNode时,表不程序进入一个方法method。此时,建立并初始化LiveMethodInfo,用于维护和支持对该方法内的语句和变量进行切片。完成初始化操作后,系统查找该通过CallInfo查找method在该次执行的调用语句,并生成调用点信息CallNode。同时,保存从调用语句继承过来的调用&控制切片 SliceOfCalIPreds。
[0051]在LiveMethodInfo 中,生成 Slice0fThis2 和 Slice0fParams2。其中Slice0fThis2记录了调用对象本身切片与形式化的对象切片,Slice0fParams2记录了程序参数中为引用类型的实参切片和形参切片。之后,生成变量切片集合SliceOfVars和节点切片集合SliceOfNodes, SliceOfVars记录了 method中除静态变量StaticVar外所有变量的切片,SliceOfNodes记录了 method中所有语句的切片。
[0052]当TraceNode类型为NormalTraceNode时,表示程序执行一条语句node。生成并初始化节点切片nodeSlice。判断该语句是否有控制依赖节点,如果有,查找当前控制依赖节点的切片SliceOfO),添加到nodeSlice,更新nodeSlice的调用&控制切片sliceOfPreds。如果没有,添加SliceOfCallPreds到nodeSlice,更新nodeSlice的调用&控制切片sliceOfPredsο
[0053]由于语句本身包含的信息量较大且复杂,对语句本身进行分析的困难度比较高。为了降低语句分析的难度同时保证语句分析的正确性,需要将一条语句转换成多条三地址码,对三地址码进行分析和切片操作。系统利用Soot将语句转换成具有三地址代码格式的Jimple代码,一条Java语句被转换成多条Jimple语句,系统对一条Java语句node的操作处转换为对多条Jimple语句units的处理。
[0054]取出每一条Jimple语句unit,判断它是否为返回语句RetUnit。如果unit是RetUnit,进行返回值切片SliceOfRet处理。否则,对语句进行变量分析,得到使用变量集合useVars和定义变量集合defVars。对于useVars中的每一个变量useVar,添加它的切片varSlice到nodeSlice中。对于defVars中的每一个变量defVar,添加nodeSlice到它的切片varSlice中。所有的Jimple语句完成后,一个node的切片完成。此时,将nodeSlice添加到SliceOfNodes中,完成一条语句的切片。
[0055]当TraceNode 类型为 MethodExitTraceNode 时,表不程序退出一个方法 method。此时,需要完成LiveMethodInfo的整理工作,包括更新this的切片结果、更新引用实参的切片结果等等。
[0056]当轨迹中所有的TraceNode处理完成时,程序切片结束,系统输出切片结果。
【权利要求】
1.一种基于程序执行轨迹的过程间动态程序切片系统,本系统使用eclipse进行开发,依据程序动态执行轨迹进行Java过程间动态程序切片,其特征在于,具体方法依据以下五步进行: 步骤I)轨迹分析TraceAnalysis,首先利用调试器的信息记录程序执行轨迹,找出该次执行中涉及的类和方法; 步骤1.1)启动系统,获得目标虚拟机连接器Connector ;Connector有共享内存连接器ShareMemoryConnector和套接字连接器SocketConnector两种,不同的Java开发工具包JDK含有其中的一种或两种; 步骤1.2)选择一种Connector, ShareMemoryConnector优先,设置共享地址后进入监听状态,等待目标虚拟机TargetVM执行; 步骤1.3) Connector监听到TargetVM启动后,立刻与TargetVM连接,获得目标虚拟机镜像 TargetVM Mirror,简称 Mirror,此时,Java Debugger 就可以通过 Mirror 对 TargetVM进行操纵; 步骤1.4)为了获得程序的轨迹信息,需要对目标虚拟机进行事件请求EventRequest设置,完成事件请求配置后,系统控制目标程序开始执行,并对程序执行产生的事件进行处理; 步骤1.4.1)当生成的事件为ThreadStartEvent时,系统设置该目标程序单步执行setStepRequest ; 步骤1.4.2)当生成的事件为MethodEntryEvent时,表示程序进入一个方法,此时,获得被进入的方法的信息MethodInfo,生成MethodEntryTraceNode,添加到Trace中; 步骤1.4.3)当生成的事件为MethodExitEvent时,表示程序离开一个方法,此时,获得离开的方法的信息MethodInfo,生成MethodExitTraceNode,添加到Trace中; 步骤1.4.4)当生成的事件为StepEvent时,获取当前准备执行语句的节点信息NodeInfo,包括类名、方法名、行号,生成NormalTraceNode,添加到Trace中;同时,根据切片准则,判断是否到达切片处,如果没有到达,继续进行事件处理,否则,结束TraceAnalysis,获得轨迹信息; 步骤1.4.5)当生成事件为VMDisconnectEvent时,表示系统与TargetVM断开连接,系统进行结束处理;事件生成时,系统设置目标虚拟机挂起产生事件的线程;当完成对应事件的处理后,线程恢复继续执行; 步骤2)类层次分析HierarchyAnalysis,对涉及的类建立类层次图; 步骤2.1)首先初始化HierarchyGraph,为HierarchyGraph添加节点,每个节点为appClass ; 步骤2.2)遍历HierarchyGraph,对每一个节点appClass,在appClasses中查找它的父类 superclass 和接 口集合 interfaces,并在 HierarchyGraph 中添加从 appClass 到superclass 和 interfaces 的继承边; 步骤 2.3)遍历 HierarchyGraph 完成,HierarchyGraph 建立完成; 步骤3)程序调用分析CallAnalysis,在类层次图的基础上建立计算方法的调用信息; 步骤3.1)获取每一个应用方法appMethod,获取它的语句集合stmts ; 步骤3.2)获取每一条语句stmt,判断其是否包含程序调用,如果没有包含程序调用,选取下一条语句;如果包含程序调用,则根据调用的类型分别进行处理; 步骤4)控制依赖分析Control Dependence Analysis,同时计算涉及方法的控制依赖; 步骤4.1)取出appMethods中的每一个方法appMethod,分析生成方法的控制流图Control Flow Graph,简称 CFG; 步骤4.2)对CFG取逆,得到appMethod的逆控制流图1nverseCFG ; 步骤4.3)通过对inverseCFG进行支配关系分析,得到appMethod的后必经树Post-Dominated Tree,简称 PDT ; 步骤4.3.1)首先获取控制流图CFG中符合特定条件的边的集合Collect1n (A,B),特定条件为I3DT中B不是A的祖先; 步骤4.3.2)然后取出每一条特定边(A,B),计算A和B的共同祖先L,如果L是A,则查找所有PDT中从A到B路径上的点Nodes,包括A但不包括B,记录Nodes到A的控制依赖关系;否则,查找所有I3DT中从L到B路径上的点Nodes,包括B但不包括L,记录Nodes到A的控制依赖关系; 步骤4.3.3)所有的边处理完成后,方法的控制依赖求解完毕; 步骤5)程序切片Slice,根据求得的所有信息计算得到程序切片; 步骤5.1)取出轨迹中的每一个节点TraceNode,判断其类型; 步骤5.2)当TraceNode类型为MethodEntryTraceNode时,表不程序进入一个方法method,此时,建立并初始化LiveMethodInfo,用于维护和支持对该方法内的语句和变量进行切片;完成初始化操作后,系统查找该通过CallInfo查找method在该次执行的调用语句,并生成调用点信息CallNode,同时,保存从调用语句继承过来的调用&控制切片SliceOfCallPreds ; 步骤5.3)当TraceNode类型为NormalTraceNode时,表不程序执行一条语句node,生成并初始化节点切片nodeSlice ;判断该语句是否有控制依赖节点,如果有,查找当前控制依赖节点的切片SliceOf⑶,添加到nodeSlice,更新nodeSlice的调用&控制切片sliceOfPreds ;如果没有,添加 SliceOfCallPreds 到 nodeSlice,更新 nodeSlice 的调用 &控制切片 sliceOfPreds ; 步骤5.4)当TraceNode类型为MethodExitTraceNode时,表不程序退出一个方法method,此时,需要完成LiveMethodInfo的整理工作; 步骤5.5)当轨迹中所有的TraceNode处理完成时,程序切片结束,系统输出切片结果。
2.根据权利要求1所述的一种基于程序执行轨迹的过程间动态程序切片系统,其特征在于,所述程序执行轨迹包括轨迹Trace以及应用类集appClasses和应用方法集appClasses and appMethods。
3.根据权利要求2所述的一种基于程序执行轨迹的过程间动态程序切片系统,其特征在于,所述轨迹Trace是一个键值对集合Collect1n〈Seq, TraceNode〉,记录程序的执行过程;Seq是执行序号,表示TraceNode产生的顺序;TraceNode是轨迹节点,记录程序每一步的执行情况;依据执行情况的不同,TraceNode的类型分为三种,分别是NormalTraceNode、MethodEntryTraceNode 和 MethodExitTraceNode,每一个 Seq 对应一个 TraceNode ;应用类集appClasses和应用方法集appClasses and appMethods是程序在执行过程中实际使用的类和方法,应用类集appClasses包括的信息为程序执行时使用的类的类名,包括包名,应用方法集appMethods包括的信息为程序执行时使用的方法的详细信息Methodlnfo。
4.根据权利要求1所述的一种基于程序执行轨迹的过程间动态程序切片系统,其特征在于,所述类层次图HierarchyGraph记录了 appClasses之间的继承关系,森林中的每一棵树是具有同一父类的类的集合,其中根节点是树中所有节点的父类,父节点是子节点的父类,子节点是父节点的派生类,HierarchyGraph中的节点是类名,边表示类的继承关系。
5.根据权利要求1所述的一种基于程序执行轨迹的过程间动态程序切片系统,其特征在于,所述程序调用分析是利用调用图CallInfo记录程序的调用关系,它由两个键值对集合组成,分别是 caller2callsites 和 callee2callsites ;caller2callsites 记录了调用方法caller对应的调用信息集合,callee2callsites记录了被调用方法callee对应的调用 息集合;调用息CallSite记录了调用点、调用方法和被调用方法。
6.根据权利要求1所述的一种基于程序执行轨迹的过程间动态程序切片系统,其特征在于,程序调用分为四种类型,分别是Staticlnvoke、SpecialInvoke> VirtualInvoke和InterfaceInvoke ; 当Invoke为Staticlnvoke时,表示调用类方法,调用点与被调用方法可以明确对应,建立调用信息CallSite ; 当Invoke为SpecialInvoke时,表示调用私有方法、超类方法或实例初始化方法,调用点与被调用方法可以明确对应,建立调用信息CallSite ; 当Invoke为VirtualInvoke时,表示调用类实例方法; 当Invoke为InterfaceInvoke时,表示调用接口方法; VirtualInvoke和InterfaceInvoke调用的调用点与被调用方法此时不能明确对应,需在程序执行时确定,此时进行进一步处理,缩小调用点与被调用方法动态对应时的查找范围。
7.根据权利要求1所述的一种基于程序执行轨迹的过程间动态程序切片系统,其特征在于,当Invoke为VirtualInvoke时,首先找到调用Invoke的引用refClass ;此时,invoke调用了 refClass和所有继承自refClass的类中对应方法的一个,因此,需要建立调用点与所有这些方法的调用信息CallSite,继承关系可以从Hierarchy中查找到,因为Hierarchy是appClasses的类层次关系,因此,继承refClass的类的范围本身是缩小的;当Invoke为InterfaceInvoke时,首先找到调用Invoke的接口 interface ;此时,invoke调用了所有继承自interface的类中对应方法的一个,因此,需要建立调用点与所有这些方法的调用信息 CalISite。
8.根据权利要求1所述的一种基于程序执行轨迹的过程间动态程序切片系统,其特征在于,所述控制依赖用于表示由于控制流引起的程序实体之间的关系,它的定义如下:令G是一个控制流图,nl和n2是G中的节点,若下列三个条件满足,则n2控制依赖nl,记为CD(n2,nl): (1)从n2到nl之间存在一条可执行路径P; (2)对P上除nl,n2外的每个节点n,节点n2都是它的后必经节点; (3)节点n2不是节点ηI的后必经节点。
9.根据权利要求1所述的一种基于程序执行轨迹的过程间动态程序切片系统,其特征在于,在 LiveMethodInfo 中,生成 Slice0fThis2 和 Slice0fParams2,其中 Slice0fThis2记录了调用对象本身切片与形式化的对象切片,SliceOfParamd记录了程序参数中为引用类型的实参切片和形参切片;之后,生成变量切片集合SliceOfVars和节点切片集合SliceOfNodes, SliceOfVars记录了 method中除静态变量StaticVar外所有变量的切片,SliceOfNodes记录了 method中所有语句的切片。
10.根据权利要求1所述的一种基于程序执行轨迹的过程间动态程序切片系统,其特征在于,在步骤5.3中,由于语句本身包含的信息量较大且复杂,对语句本身进行分析的困难度比较高,为了降低语句分析的难度同时保证语句分析的正确性,需要将一条语句转换成多条三地址码,对三地址码进行分析和切片操作,系统利用Soot将语句转换成具有三地址代码格式的Jimple代码,一条Java语句被转换成多条Jimple语句,系统对一条Java语句node的操作处转换为对多条Jimple语句units的处理; 取出每一条Jimple语句unit,判断它是否为返回语句RetUnit ;如果unit是RetUnit,进行返回值切片SliceOfRet处理,否则,对语句进行变量分析,得到使用变量集合useVars和定义变量集合defVars ;对于useVars中的每一个变量useVar,添加它的切片varSlice到nodeSlice中;对于defVars中的每一个变量defVar,添加nodeSlice到它的切片varSlice中;所有的Jimple语句完成后,一个node的切片完成;此时,将nodeSlice添加到SliceOfNodes中,完成一条语句的切片。
【文档编号】G06F11/36GK104461883SQ201410728471
【公开日】2015年3月25日 申请日期:2014年12月3日 优先权日:2014年12月3日
【发明者】姜淑娟, 王兴亚, 刘颖祺, 张艳梅, 于巧 申请人:中国矿业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1