一种Java异常传播的静态结构抽取方法转让专利

申请号 : CN201110334592.7

文献号 : CN102521117B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 张莉邱翔连小利

申请人 : 北京航空航天大学

摘要 :

本发明公开了一种Java异常传播的静态结构抽取方法,该方法以异常类型层次关系为依据,以方法调用关系为基础,结合Java异常传播过程中存在的异常抛出和捕获关系,从而能够较为完整地对Java异常传播的静态结构进行抽取。为了克服复杂的层次结构对异常传播的结构抽取带来的困境,本方法将系统异常类型与用户自定义异常类型进行融合,构建相对完整的异常类型层次结构树;在方法调用依赖图的基础上,通过异常抛出和捕获关系与异常类型层次结构树相关联,构建软件扩展依赖图。通过以异常类型捕获点为异常传播结构搜索起始点,采用以深度优先搜索算法为基础、异常类型层次树为依据的抽取算法,完成对Java异常传播结构的抽取。

权利要求 :

1.一种Java异常传播的静态结构抽取方法,其特征在于该方法通过如下三个阶段实现:

第一阶段:利用开源分析软件DependceFinder和开源分析软件ASM对jar包进行预处理;所述ASM对分析jar包进行用户自定义异常类型层次结构的抽取,并与系统异常类型层次结构进行融合;

首先对待分析的jar包进行预处理,抽取类中的方法元素及其之间的调用关系,构建软件依赖图;

其次,依据jar包中的自定义异常层次结构和用户自定义异常层次结构对异常传播结构完整性和正确性的影响,构建异常层次结构树;

第一阶段中开源软件DependceFinder对待分析的jar包进行解析,生成描述jar包中各个元素之间依赖关系的XML文件,通过对该XML文件的解析从而识别出类中的方法及其之间的调用关系;在分析异常类型层次结构时,首先对Java系统定义异常类型层次进行抽取,利用开源软件ASM对Java运行环境中的resources.jar、rt.jar、jsse.jar、jce.jar、charsets.jar、dnsns.jar、localedata.jar、sunjce_provider.jar、sunmscapi.jar、sunpkcs11.jar进行扫描并对其中存在的异常类型层次抽取出来;

第二阶段:扩充所述jar包中方法之间的调用依赖关系,通过异常传播相关的抛出关系和捕获关系与第一阶段中的异常层次结构树相关联,构建软件扩展依赖图;第二阶段是以在第一阶段建立的软件依赖图的基础上,通过在第一阶段中对所述jar包中的类的每个方法进行异常抛出关系和捕获关系的识别,将以所述jar包中的方法调用为基础的软件依赖图与在第一阶段建立的异常层次结构树相关联,构建软件扩展依赖图;

第三阶段:采用自顶向下分析法对所述jar包中的每个方法中的异常捕获点,即Java异常处理的catch块为搜索起点,按照捕获异常类型的传播途径,寻找异常抛出源点,从而完成异常传播结构的抽取;第三阶段中采用异常传播分析中的自顶向下分析法,即在对捕获异常类型的异常传播路径抽取过程中,以捕获点作为开始搜索的起点,以搜索起始方法的调用链为基础,对传播路径进行搜索,是以深度优先为主并在确认传播路径中间节点的过程中需要以异常层次结构为依据,从而才能准确和完整地抽取与捕获异常类型相关的异常传播路径。

2.根据权利要求1所述的Java异常传播的静态结构抽取方法,其特征在于:对异常抛出源点的搜索,是基于深度优先搜索的方法,依照所述jar包中的方法调用链识别相应的该类异常的传播路径。

3.根据权利要求1所述的Java异常传播的静态结构抽取方法,其特征在于是针对给定的待分析的Java软件系统采用如下步骤:步骤101:利用DependceFinder对待分析的jar包进行扫描,生成描述该jar包内各种编程元素之间依赖关系的XML文件;通过对XML文件的解析抽取jar包类中的方法及其之间的调用关系,构建软件依赖图;

步骤102:利用ASM对Java工具包中的常用系统jar包进行扫描,并对其中的系统异常类型之间的层次关系进行解析,构建待分析的jar包异常层次结构树;

步骤103:利用ASM对待分析的jar包进行扫描,并对其中的用户自定义异常类型之间的层次关系进行解析,并与待分析的jar包异常层次结构树进行融合;

步骤104:在步骤103中的ASM扫描的结果中,提取类中方法的异常抛出关系和对相关异常类型的捕获关系;

步骤105:对于每一个类中的方法,其异常抛出关系和异常捕获关系所涉及的异常类型需要在步骤102中的异常类型层次结构中查找,从而建立软件依赖关系图和异常层次结构树的联系,构成软件扩展依赖图;

步骤106:main函数首先入栈,判断在关于非法合计异常Illegal Amount Exception的try-catch块中是否捕获了调用方法抛出的异常;在分析异常类型是否被catch块捕获时,需要在异常层次结构中判断两种异常类型的继承关系:当且仅当catch块捕获的是某一异常类型或其父类型或祖先类型才能够处理try块中方法所抛出的这一异常类型;

步骤107:对异常传播路径的提取的范围是当前分析的软件包,不包括第三方工具软件包以及运行环境;

步骤108:依次对方法栈method stack进行退栈即可得到相应的异常传播链式结构,异常传播结构抽取过程结束。

说明书 :

一种Java异常传播的静态结构抽取方法

技术领域

[0001] 本发明涉及一种应用于基于Java编程语言的软件结构静态分析方法,特别是一种用于获取软件系统中异常传播结构的方法,属于计算机软件度量与分析领域。

背景技术

[0002] 软件系统功能的多样化和复杂化使软件鲁棒性问题已经成为业界关注的主要问题之一。目前,研究者已经提出了多种提高软件鲁棒性的方法。异常处理机制是现代编程语言为软件开发者提供的一种构建健壮系统的手段,它将系统在异常情况下的正常控制流与处理该异常的控制流进行分离。但遗憾的是,在庞大的系统中对异常控制流的分析是很困难的。
[0003] 异常处理的概念是由John Goodenough在1975年首次提出的。目前为大多数研究者所接受的异常的定义是:异常是在程序的执行过程中检测到的不正常的事件,它使程序不能继续沿着正常的路径执行。异常以及异常处理过程是与编程语言紧耦合的,因此,异常类型分为三类:错误(Error)、运行时异常(Runtime Exception)和可检测异常(Checked Exception)。其中错误和运行时异常为动态检测异常,可检测异常又称编译期异常,该类异常在程序设计时必须进行处理。
[0004] 异常的产生往往和异常的处理过程相互进行绑定。但是在复杂的软件系统中,异常的产生和处理过程并不一定在一个局部化区域内。例如以Java语言构造的软件系统为例,Java语言异常处理机制并没有把异常点和异常处理程序“紧密”地连接起来,而是通过方法调用栈进行关联,因此,Java语言的异常处理机制存在明显维护性问题:对于某种异常类型的抛出,如何确定该异常的处理程序片段在该软件系统的位置。
[0005] 对于Java语言而言,一旦抛出异常,程序会搜索匹配该异常的第一个catch块进行异常处理。由抛出异常的方法到最终确定包含该异常类型处理块的方法所途径的调用链就是该异常类型的异常传播路径。对于开发者而言,异常传播频繁跨越组件的边界,具有全局性;而异常也在其传播路径上跳跃多次并有可能抽象化,增加了对异常的抛出位置和处理位置分析的难度。另外,对于异常传播的修改在异常处理全局性的影响下就需要更多的成本。
[0006] 因此,如何提供一种异常传播结构抽取方法,帮助开发者能够对异常传播机制进行充分的理解和分析成为在软件开发和后续维护过程中提高效率、降低成本的关键因素之一。

发明内容

[0007] 本发明的目的是提出一种Java异常传播的静态结构抽取方法,是对以方法调用为基础的软件依赖图进行扩展,将方法和异常类型通过抛出关系和捕获关系进行关联,将软件依赖关系和异常类型层次结构进行有机地结合,提出了软件扩展依赖图。以软件扩展依赖图为基础,提出了一种基于深度优先搜索的异常传播路径提取方法,将异常传播结构描述成与某种被处理异常相关的方法调用链,即异常传播路径。本专利提供的方法能够使软件开发者较为容易的提取java应用中的异常传播结构,为软件维护提供了指导性意见。
[0008] 本发明是一种Java异常传播的静态结构抽取方法,该方法通过如下三个阶段实现:
[0009] 第一阶段:利用开源分析软件DependceFinder和开源分析软件ASM对jar包进行预处理;
[0010] 首先对待分析的jar包进行预处理,抽取类中的方法元素及其之间的调用关系,构建软件依赖图;
[0011] 其次,依据jar包中的自定义异常层次结构和用户自定义异常层次结构对异常传播结构完整性和正确性的影响,构建异常层次结构树;
[0012] 第二阶段:扩充所述jar包中方法之间的调用依赖关系,通过异常传播相关的抛出关系和捕获关系与第一阶段中的异常层次结构树相关联,构建软件扩展依赖图;
[0013] 第三阶段:采用自顶向下分析法对所述jar包中的每个方法中的异常捕获点,即Java异常处理的catch块为搜索起点,按照捕获异常类型的传播途径,寻找异常抛出源点,从而完成异常传播结构的抽取。
[0014] 本发明的一种Java异常传播的静态结构抽取方法,其特征在于是针对给定的待分析的Java软件系统采用如下步骤:
[0015] 步骤101:利用DependceFinder对待分析的jar包进行扫描,生成描述该jar包内各种编程元素之间依赖关系的XML文件;通过对XML文件的解析抽取jar包类中的方法及其之间的调用关系,构建软件依赖图;
[0016] 步骤102:利用ASM对Java工具包中的常用系统jar包进行扫描,并对其中的系统异常类型之间的层次关系进行解析,构建待分析的jar包异常层次结构树;
[0017] 步骤103:利用ASM对待分析的jar包进行扫描,并对其中的用户自定义异常类型之间的层次关系进行解析,并与待分析的jar包异常层次结构树进行融合;
[0018] 步骤104:在步骤103中的ASM扫描的结果中,提取类中方法的异常抛出关系和对相关异常类型的捕获关系;
[0019] 步骤105:对于每一个类中的方法,其异常抛出关系和异常捕获关系所涉及的异常类型需要在步骤102中的异常类型层次结构中查找,从而建立软件依赖关系图和异常层次结构树的联系,构成软件扩展依赖图;
[0020] 步骤106:main函数 首先入栈,判断在关 于IllegalAmountException的try-catch块中是否捕获了调用方法抛出的异常;在分析异常类型是否被catch块捕获时,需要在异常层次结构中判断两种异常类型的继承关系:当且仅当catch块捕获的是某一异常类型或其父类型或祖先类型才能够处理try块中方法所抛出的这一异常类型;
[0021] 步骤107:对异常传播路径的提取的范围是当前分析的软件包,不包括第三方工具软件包以及运行环境;
[0022] 步骤108:依次对methodstack进行退栈即可得到相应的异常传播链式结构,异常传播结构抽取过程结束。
[0023] 本发明的一种Java异常传播的静态结构抽取方法优点:
[0024] ①由于软件系统功能的多样化和复杂化,软件开发者在庞大的系统中对异常传播结构的分析是很困难的。针对复杂的Java应用,对于某种异常类型的抛出,如何确定该异常的处理程序片段在该软件系统的位置是分析异常传播结构面临的难题。本专利提出的方法能够帮助开发者提取异常传播结构,从而确定异常的抛出源点,为开发者对Java应用的维护提供支持。
[0025] ②随着软件需求的不断变更,基于Java语言的Web应用服务器(如Tomcat)的功能复杂程度加大了软件开发和维护人员对其后期维护和版本变更的难度。其中Web应用服务器中的异常传播现象让软件开发人员无法确定异常抛出源点,使软件异常处理程序更加难以维护,增加了时间和人力成本。本专利通过半自动化的搜索算法从Web应用服务器中抽取异常传播结构,确定异常抛出源点,便于软件开发人员在对异常处理结构维护过程中分析维护成本,从而提出有效的维护和变更策略。

附图说明

[0026] 图1为异常传播结构抽取实施阶段示意图。
[0027] 图2为示例Java源代码及对应的软件依赖示意图。
[0028] 图3A为示例Java源代码中调用源代码示意图。
[0029] 图3B为示例Java源代码中抛出源代码示意图。
[0030] 图3C为示例Java源代码中捕获源代码示意图。
[0031] 图3D为示例Java源代码中继承源代码示意图。
[0032] 图4为示例Java源代码中调用-抛出-捕获-继承源代码的软件扩展依赖示意图。
[0033] 图5为异常传播路径抽取算法实施步骤C1的示意图。
[0034] 图6为异常传播路径抽取算法实施步骤C2的示意图。

具体实施方式

[0035] 下面将结合附图对本发明做进一步的详细说明。
[0036] 鉴于Java软件系统中的异常传播结构对软件健壮性维护的重要性和异常传播结构抽取的复杂性,本发明的目的就是提出一种针对Java软件系统的静态异常传播结构的抽取方法,用于帮助软件开发者从原有的Java软件系统中分离出异常传播结构,将异常控制流与软件正常控制流错综复杂的交织关系清晰化,降低软件后续维护阶段的人力、资源和时间成本。该方法将Java系统自定义异常层次结构与用户自定义异常层次结构相融合,以提高抽取后的异常传播结构的完整性和正确性。
[0037] 为了实现上述的目的,本发明提出的Java异常传播的静态结构抽取方法包括下述三个阶段:
[0038] 第一阶段:利用开源分析软件DependceFinder和ASM对待分析软件jar包进行预处理。首先抽取待分析的jar包类中的方法元素及其之间的调用关系,构建软件依赖图;其次,充分考虑系统自定义异常层次结构和用户自定义异常层次结构对异常传播结构完整性和正确性的影响,构建较为完整的异常层次结构树。对确定版本的Java开发工具包(Java Development Kit,JDK)进行系统自定义异常层次结构的抽取;对以jar包形式存在的Java软件系统进行预处理,抽取用户自定义异常层次结构,并与系统自定义异常层次结构相融合。
[0039] 第二阶段:扩充传统软件中方法之间的调用依赖关系,通过与异常传播相关的抛出关系和捕获关系与阶段A)中的异常类型层次结构树相关联,构建软件扩展依赖图。通过对软件系统的jar包进行扫描处理,对jar包中每个方法所处理以及抛出的异常类型进行识别。确定方法捕获或抛出的异常类型在阶段A)中的异常类型层次结构树中的层次位置,为异常传播结构的抽取提供依据。
[0040] 第三阶段:采用自顶向下的思路,以每个方法中的异常捕获点(Java异常处理的catch块)为搜索起点,按照捕获异常类型的传播途径,寻找异常抛出源点,从而完成异常传播结构的抽取。对异常抛出源点的搜索,是基于深度优先搜索的思想,依照方法调用链识别相应的该类异常的传播路径。
[0041] 软件系统从本质上可以抽象成一系列计算单元(或称为计算服务提供者)以及它们之间的依赖关系。在面向对象软件中,与面向过程软件不同的是,服务提供者除了函数之外还可以是类或者接口,除了函数之间的调用关系构成了计算服务之间的依赖关系,类或者接口的继承、依赖、关联、聚合和组成等关系也构成了软件实体内部单元的依赖关系。
[0042] 如图1所示,本发明在第一阶段将软件抽象成一系列计算服务提供者以及它们之间的依赖关系,而这里计算服务提供者定义的粒度为类或者接口的方法,而依赖关系则为方法之间的调用关系。下面本发明给出基于方法调用的软件依赖图的形式化定义。
[0043] 定义1:对于一个面向对象软件的软件依赖图G=。其中,G是有向无权图;V是节点集合,V中的每个节点(v1,v2,…,vi,…,vj,…)对应类或接口的方法;E是边的集合,E中的每条边都是一个有序对,当且仅当vi调用vj时,∈E。
[0044] 本发明以开源软件DependceFinder(http://depfind.sourceforge.net)对jar包进行解析,生成描述方法调用关系的XML文件,通过对该XML文件的解析从而完成方法之间的调用关系的识别。
[0045] 根据定义1,可以得到图2中Java源代码所对应的依赖图。其中,表示类的构造方法,在java代码编译后构造方法就用来表示。
[0046] 以Java为例,程序的异常处理机制由try-catch-finally块完成。如果方法在一个特殊的区块抛出了异常,并且异常能够被捕获,此种区块被称为try块,由关键字“try”进行标识。当异常被抛出时,异常处理机制将负责搜索参数与异常类型相匹配的第一个处理程序块,这就是catch块,由“catch”进行标识。finally块是程序无论有无异常都会执行的代码块,主要用于程序初始状态的恢复,由“finally”进行标识。
[0047] 本方法在异常传播结构抽取时所考虑的异常类型层次结构包括Java工具包以及用户自定义的异常类型。ASM是操控和分析Java字节码的开源框架,本方法利用ASM对Java工具包及待分析的jar包进行扫描,分析异常类型之间的层次关系,从而构建一个以Java系统异常类型为基础,融入用户自定义异常的完整的异常类型层次结构树。
[0048] 如图1所示,软件依赖图描述了软件实体以方法为基本单元的调用依赖关系。为了能够有效地抽取异常传播路径,从而确定抛出异常的源方法以及异常的捕获方法,本发明对软件依赖图进行了扩展,该扩展图(软件扩展依赖图)包括三种元素:扩展图方法、扩展图异常类型以及与异常传播相关的抛出关系和捕获关系,其形式化定义如下:
[0049] 定义2:对于一个抽象的异常传播模型CG=。其中CG为有向无权图;CV是节点集合,CV={EV,MV},其中EV中的每个节点(ev1,ev2,…,evi,…,evj,…)对应异常类型节点,MV中的每个节点(mv1,mv2,…,mvi,…,mvj,…)对应方法节点;CE是边的集合,对于异常传播模型,应存在三种类型的边:
[0050] 第一类型边:是一个有序对,对应异常类型之间的层次关系,主要是继承关系;当且仅当evi继承于evj,∈CE;
[0051] 第二类型边:是一个有序对,对应方法与异常类型之间的抛出关系与捕获关系;当且仅当mvi抛出或捕获evj,∈CE;
[0052] 第三类型边:是一个有序对,对应方法与方法之间的调用关系;当且仅当mvi调用mvj时,∈CE。
[0053] 根据定义2,可以得到图3A、图3B、图3C、图3D中Java源代码所对应的软件扩展依赖图,如图4所示。
[0054] 在本发明中,扩展图方法之间的调用关系与异常类型之间的层次结构构成了软件扩展依赖图的基础;而方法节点与异常类型节点之间的抛出关系和捕获关系将上述两个基本结构有效地进行关联。本发明通过对方法声明以及对方法定义中catch块的搜索来确定异常抛出关系和捕获关系,从而完成对静态异常传播结构的抽取。
[0055] 对于软件开发者而言,异常的传播具有较弱的边界性、较强的耦合性。异常的抛出和处理往往忽略了系统边界的定义,甚至是对组件或者模块之间的跨越;而抛出点和处理点所构成的路径又与诸多组件或模块相关联,这就为组件或模块的变更带来了一定的困难。因此,对异常传播路径的提取,能够帮助开发者确定传播边界,分析与软件系统其他模块或组件的耦合关系,可以有效地提高软件鲁棒性和可演化性。
[0056] 在面向对象语言中,一个异常被表示为一个类的实例,这就为异常传播路径的提取带来了挑战。由于异常的分类来源于异常层次结构,因此,在对异常类型进行捕获时可以发生如下情况:对异常类型的捕获语句可以实现对其一系列子类型的捕获,而异常的抛出也存在这种情况。如图3D所示,类Dispenser中的dispense方法中SelectionNotAvailableException和IllegalAmountException 的抛 出 可以 由 其父类SelectionException在方法声明中注明;同样,类Dispenser中的main方法对SelectionException的捕获,也可以对其子类型进行捕获。因此,异常类型的层次结构对异常的抛出和捕获都有语义模糊化的影响,也是传播路径的提取时必须要考虑的问题。
[0057] 本发明以软件扩展依赖图为基础,提出了静态异常传播结构抽取方法,描述如下:
[0058] (一)异常传播路径的提取方法(algorithm for extracting Exception Propagation Paths)
[0059] 输入:软件扩展依赖图(Software Extended Dependency Graph:SEDG)[0060] 输出:异常传播路径(Exception Propagation Paths:EPP)
[0061] Begin extractEPP
[0062] 1为访问传播路径中的方法初始化方法栈methodstack;
[0063] 2为访问传播路径中的每个方法所抛出或捕获的异常类型初始化异常类型栈typestack;
[0064] 3 for SEDG中的每一个方法tcMethod do
[0065] 4 if该方法中的try-catch块的数目不为0
[0066] 5 将方法压入methodstack;
[0067] 6 for tcMethod中的每一个try-catch块do
[0068] 7 将该try-catch块捕获的异常类型压入typestack;
[0069] 8 从SEDG中获取tcMethod的调用方法列表calleeMethodList;
[0070] 9 for calleeMethodList中的每一个方法calleeMethod do[0071] 10 if calleeMethod在该try-catch块中被捕获
[0072] 11 将calleeMethod被捕获的异常类型压入typestack;
[0073] 12 将calleeMethod压入methodstack;
[0074] 13 调用异常传播路径的源点搜索算法searchEPS;
[0075] 14 从methodstack弹出栈顶;
[0076] 15 从typestack弹出栈顶;
[0077] 16 end if
[0078] 17 end for
[0079] 18 从typestack弹出栈顶;
[0080] 19 end for
[0081] 20 从methodstack弹出栈顶;
[0082] 21 end if
[0083] 22 end for
[0084] end extractEPP
[0085] (二)异常传播路径的源点搜索方法(algorithm for searching Exception Propagation Source)
[0086] 输入:待分析的异常类型(Exception),开始搜索的方法节点(method),软件扩展依赖图(Software Extended Dependency Graph:SEDG)
[0087] begin searchEPS
[0088] 1从SEDG中获取method的调用方法列表calleeMethodList;
[0089] 2 if calleeMethodList为空
[0090] 3 method为Exception的一个抛出源点;
[0091] 4 return;
[0092] 5 end if
[0093] 6 if method中存在Exception的throw语句
[0094] 7 method为Exception的一个抛出源点;
[0095] 8 end if
[0096] 9 for calleeMethodList中的每一个方法calleeMethod do
[0097] 10 if method中的try-catch块的数目不为0
[0098] 11 for method中的每一个try-catch块do
[0099] 12 记录calleeMethod在try-catch块中被捕获的异常类型;
[0100] 13 end for
[0101] 14 end if
[0102] 15 通过对待分析的异常类型和被捕获的异常类型进行层次分析,[0103] 确定calleeMethod未被捕获的异常类型
[0104] 16 if存在未被捕获的异常类型是待分析异常类型或是其子类型[0105] 17 将未被捕获的异常类型作为下次分析的待分析的异常类型;
[0106] 18 将calleeMethod被捕获的异常类型压入typestack;
[0107] 19 将calleeMethod压入methodstack;
[0108] 20 递归调用searchEPS;
[0109] 23 从methodstack弹出栈顶;
[0110] 21 从typestack弹出栈顶;
[0111] 22 end if
[0112] 23 end for
[0113] 24 if calleeMethodList中的calleeMethod没有抛出任何异常[0114] 25 method为Exception的一个抛出源点;
[0115] 26 end if
[0116] end searchEPS
[0117] 在本发明提出的方法中,通过设定三个搜索终止条件来确定异常传播路径的源点:
[0118] 第一搜索终止条件:如果当前方法存在throw语句,且抛出的类型与待分析的类型相同或是其子类型,则当前方法为源点。
[0119] 第二搜索终止条件:如果当前方法不存在其它的调用方法,则当前方法为源点。
[0120] 第三搜索终止条件:如果当前方法的调用方法没有跑出任何异常类型,则当前方法为源点。
[0121] 在本发明中,软件扩展依赖图是本方法的基础,而在方法实现过程中,异常类型层次结构是判断方法所抛出的异常类型是否被捕获的关键因素。本发明对异常层次结构的构造方法分为两步:
[0122] 构造步骤1:对Java开发工具包JDK中常见异常类型的继承关系进行抽取,构建一个较为全面的树形继承结构图,如图4中的右部分;
[0123] 构造步骤2:对待分析的开源软件包(在本发明中,为被分析对象)进行用户自定义异常类型继承结构进行抽取,更新已有树形结构。
[0124] 通过以上两步的实施,能够获取到较为完整异常类型层次结构,但该结构不包含第三方工具包的异常类型层次结构,因此会对算法中传播路径提取的完整性造成一定的影响,即减少异常传播路径的跳数。
[0125] 在对异常传播研究方法中,存在两种方法:一种是自顶向下,主要用于对异常抛出的源点进行推理;另外一种是自底向上,主要用于分析异常传播作用于整个系统的影响。而本发明提出的异常传播路径提取算法是基于自顶向下的思路,从每个方法中的try-catch块中的异常捕获点开始分析,从而依传播路径寻找异常的抛出源点。
[0126] 本发明提出的异常传播结构抽取方法是针对给定的待分析的Java软件系统分别采用如下具体步骤。
[0127] 步骤101:利用DependceFinder对待分析的jar包进行扫描,生成描述该jar包内各种编程元素之间依赖关系的XML文件;通过对XML文件的解析抽取jar包类中的方法及其之间的调用关系,构建软件依赖图;
[0128] 步骤102:利用ASM对Java工具包中的常用系统jar包进行扫描,并对其中的系统异常类型之间的层次关系进行解析,构建待分析的jar包异常层次结构树;
[0129] 步骤103:利用ASM对待分析的jar包进行扫描,并对其中的用户自定义异常类型之间的层次关系进行解析,并与待分析的jar包异常层次结构树进行融合;
[0130] 步骤104:在步骤103中的ASM扫描的结果中,提取类中方法的异常抛出关系和对相关异常类型的捕获关系;
[0131] 步骤105:对于每一个类中的方法,其异常抛出关系和异常捕获关系所涉及的异常类型需要在步骤102中的异常类型层次结构中查找,从而建立软件依赖关系图和异常层次树的联系,构成软件扩展依赖图;如果异常类型不存在,则说明该异常类型可能存在于第三方工具包,不予考虑;
[0132] 为了达到第三阶段的目标,本发明以图3A、图3B、图3C、图3D中main方法处理IllegalAmountException为例来阐述如何利用自顶向下对异常传播的源点进行搜索,具体采用如下的实施步骤。
[0133] 步骤106:main函数 首先入栈,判断在关 于IllegalAmountException的try-catch块中是否捕获了调用方法抛出的异常,如图5所示,vend、returnCoins和insert方法都在该try-catch块中,但通过方法抛出关系的识别和异常类型层次结构的分析,只捕获了vend方法所抛出的IllegalAmountException,此时将vend方法压入方法栈。在分析异常类型是否被catch块捕获时,需要在异常层次结构中判断两种异常类型的继承关系:当且仅当catch块捕获的是某一异常类型或其父类型或祖先类型才能够处理try块中方法所抛出的这一异常类型。
[0134] 步骤107:对异常传播路径的抛出源点进行搜索。如图6所示,vend方法将作为进一步搜索的起始方法,IllegalAmountException作为待分析的异常类型;通过对returnCoins、value、dispense方法的抛出异常做关于IllegalAmountException的未捕获判断,最终确定dispense方法为传播路径的一个方法节点,最后通过递归调用关系,发现dispense方法符合判断条件的第一条,至此以IllegalAmountException为捕获异常类型的异常传播路径搜索完毕。针对判断条件的第二点存在前提条件:对异常传播路径的提取的范围是当前分析的软件包,不包括第三方工具软件包以及运行环境。
[0135] 步骤108:依次对methodstack进行退栈即可得到相应的异常传播链式结构(由异常抛出源点到捕获点,见表1),异常传播结构抽取过程结束。
[0136] 表1异常传播路径的提取
[0137]序号 异常类型 异常传播路径(抛出→捕获)
1 ZeroValueException ②→①
2 ZeroValueException ②→⑥
3 ZeroValueException ①→⑥
4 SelectionException ①→⑥
5 SelectionException ⑤→①
6 IllegalAmountException ⑤→①→⑥
7 IllegalCoinException ③→⑥
8 Java.lang.Exception ②→⑥
[0138] 在上述发明过程中,融合系统自定义异常和用户自定义异常的异常类型层次结构,基于方法调用关系的软件扩展依赖图(定义)以及以上述两者为基础的异常传播结构抽取算法都属本发明权利要求的保护范围。