软件程序中变量的不安全使用的检测方法转让专利

申请号 : CN201010500543.1

文献号 : CN101937396B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 伍晓泉魏峻高楚舒

申请人 : 中国科学院软件研究所

摘要 :

本发明公开了一种软件程序变量的不安全使用的检测方法,属于程序分析技术领域,包括如下步骤:1)建立软件程序的控制流图;2)根据控制流图,对程序进行层次化的数据流分析,获得程序中每一个变量的操作序列;3)检测每个操作序列中是否出现变量的不安全使用。本发明所提出的软件程序变量的不安全使用的检测方法,能快速检测到变量的不安全使用,运用在程序软件的开发早期,能及早发现程序中,特别是程序的异常处理代码中的缺陷,改善代码质量,提高软件的可靠性,降低软件开发成本。

权利要求 :

1.一种软件程序中变量的不安全使用的检测方法,包括如下步骤:

1)建立软件程序的控制流图,所述软件程序中包括正常程序、警戒区域和异常处理模块,或者包括正常程序语句、警戒区域和finally模块,或者包括正常程序语句、警戒区域、finally模块和异常处理模块;其步骤包括:A、建立正常执行路径,将每条正常程序语句设定为一个节点,按语句执行顺序,两相邻语句之间设置有向边;

B、建立警戒区域的内部执行路径,将警戒区内的每条语句设定为一个节点,按照语句执行顺序,两相邻语句之间设置有向边;

C、建立正常程序语句与后续警戒区域之间的有向边;

D、建立异常执行路径,在警戒区域抛出异常对象后,查找与异常对象相对应的异常处理模块,若查找到,建立异常处理模块内部执行路径,并在异常对象节点与异常处理模块的第一个节点之间建立有向边;若查找不到,设置异常退出节点,建立异常对象节点指向异常退出节点的有向边;

E、查找finally模块,若查找到,建立finally模块内部执行路径;建立警戒区域最后节点和异常处理模块最后节点指向finally模块之间的有向边;建立finally模块与后续正常语句节点之间的有向边;将finally模块插入异常对象节点与异常退出节点之间,按语句执行顺序建立有向边;若查找不到,建立警戒区域最后节点指向后续正常程序语句的有向边,并建立异常处理模块最后节点指向后续正常程序语句的有向边;

2)根据控制流图,对程序进行层次化的数据流分析,获得程序中每一个变量的操作序列;

3)检测每个操作序列中是否出现变量的不安全使用。

2.根据权利要求1所述的软件程序中变量的不安全使用的检测方法,其特征在于所述变量的不安全使用是指操作序列中依次出现eDef和Use,且eDef和Use之间不存在其它eDef和sDef时,Use为变量的不安全使用。

3.根据权利要求1所述的软件程序中变量的不安全使用的检测方法,其特征在于所述与异常对象相对应的异常处理模块是指该异常处理模块参数的异常类型与异常对象的类型相同,或是异常对象的父类型。

4.根据权利要求1所述的软件程序中变量的不安全使用的检测方法,其特征在于建立异常处理模块内部执行路径的方法为:将异常处理模块内的每条语句设定为一个节点,按照语句执行顺序,两相邻语句之间设置有向边。

5.根据权利要求1所述的软件程序中变量的不安全使用的检测方法,其特征在于建立finally模块内部执行路径的方法为:将finally模块内的每条语句设定为一个节点,按照语句执行顺序,两相邻语句之间设置有向边。

6.根据权利要求1所述的软件程序变量的不安全使用的检测方法,其特征在于所述第

2)步的执行方法如下:

A、确定控制流图中对变量进行操作的节点的变量操作类型;

B、遍历控制流图,为控制流图中每一条执行路径上的每一个变量生成操作序列。

7.根据权利要求6所述的软件程序中变量的不安全使用的检测方法,其特征在于所述变量的操作类型为sDef、eDef或Use。

8.根据权利要求1所述的软件程序中变量的不安全使用的检测方法,其特征在于警戒区域为try语句块,异常处理模块为catch语句块。

说明书 :

软件程序中变量的不安全使用的检测方法

技术领域

[0001] 本发明涉及一种软件程序缺陷的检测方法,尤其涉及软件中与异常处理相关的程序变量的不安全使用的检测方法,属于程序分析技术领域。

背景技术

[0002] 软件程序的运行依赖于一定的运行环境,运行环境直接影响软件运行结果的正确性。例如:运行时计算机内存耗尽,可能导致程序被迫停止,而没有产生正确的执行结果。这种违背预期正常执行的程序行为,称为程序发生异常。为了提高软件程序的可靠性,使软件程序更好的适应动态变化的运行环境,需要在软件设计时在程序中加入异常处理模块,预先指定程序发生异常后应当执行的操作,以减少程序运行过程中的意外终止。
[0003] 高级程序设计语言如JAVA、C++等,提供了异常处理机制,将异常处理技术固化在程序设计语言结构中。异常处理机制包括:预先设定了程序运行时可能捕获到的所有异常类型,在程序运行过程中监测异常的发生,当发生异常时,生成异常对象,并通过异常传播机制,将异常传递给相应的异常处理模块。异常处理模块是程序员预先设定的异常发生后的处理动作。设计程序时,程序员将程序中的一段代码指定为警戒区域,当警戒区域内部出现异常时,程序跳转到异常处理模块,执行程序员事先指定的异常处理操作,使程序继续运行下去,避免程序的崩溃。
[0004] 然而异常处理模块的引入,增加了程序的控制流程,从而增加了编程的难度。最近的一些调研报告指出,在实际开发中,异常处理代码的质量往往不高,程序的异常处理模块中普遍存在设计缺陷,且这类缺陷难以被现有的方法和工具发现。因此,需要一种发现软件异常处理模块缺陷的方法,以提高软件质量。
[0005] 目前改进软件质量的技术主要有:软件测试、代码评审以及形式验证。软件测试,是使用人工或者自动方式来生成程序的输入,运行程序获得输出结果,通过比较输出结果是否与预期相符来判断程序中是否存在缺陷。它要求被测试的是一个可运行的系统,并接受一定的输入。但是通过程序的输入难以控制程序运行时产生异常,也就难以得到异常发生后程序的输出结果,因此难以判断程序异常执行路径上是否存在缺陷。代码评审也称代码复查,是指通过阅读代码来检查源代码与编码标准的符合性以及代码质量,通常由人手工完成,因此效率不高。软件形式验证的主要思想是通过使用形式证明的方式来验证一个程序设计得是否正确,它不适用于大规模的软件系统。
[0006] 在软件开发过程中,发现并修正程序缺陷是一个花费巨大的工作。软件产品的开发依次历经需求、设计、编码、测试、部署几个阶段。软件开发的普遍经验表明:尽早的发现程序中的缺陷,尽早的改正,有助于降低软件开发的成本。因此,与软件测试、代码评审以及形式验证的方法相比,利用程序的静态分析技术能够在程序开发的早期自动化的发现程序中的缺陷,有助于降低软件开发的成本。
[0007] 目前,已经有一些研究成果,能够利用程序分析技术自动的发现程序中的缺陷。包括:
[0008] ●开源软件工具FindBugs(http://findbugs.sourceforge.net/)是一个利用静态程序分析技术检测Java程序缺陷模式的工具。所谓缺陷模式,是指某些编码习惯,它们通常都是程序的缺陷。
[0009] ●JLint(http://artho.com/jlint/)与FindBugs类似,分析Java程序,执行语法检查和数据流分析。
[0010] ●PMD(http://pmd.sourceforge.net/)只对Java源代码进行语法检查,主要用于检查程序代码风格。
[0011] 这些工具能够检测出来的程序缺陷有:空引用、并发程序中的死锁、数组长度小于零、以零作为除数、不可达的程序代码(dead code)、在执行路径中输入输出流没有关闭等。
[0012] 已有的方法、技术及工具表明:利用静态程序分析的方法,能够有效的发现程序设计的缺陷,有助于改善程序质量。但同时,已有的方法、技术及工具还有不完善的地方,它们并不能找出所有的程序缺陷,特别是程序异常处理模块的设计缺陷。
[0013] 软件程序应该具有这样的特性:当一个操作在执行过程中发生异常而失效时,依赖于这个操作成功执行的后续操作应该停止执行。否则会将不正确的程序状态继续传播下去,引起不正确的程序结果。软件程序的这个特性称为依赖安全(dependency safety)。依赖安全的特性保证了当程序由于异常或其它原因导致操作失效时,程序能够停止在一个一致的状态。违背了这个特性,往往意味着程序设计的缺陷。现有的方法、技术及工具并不能发现软件程序设计中的这种缺陷,因此本发明提供了一种静态检测方法,利用程序中变量之间的依赖关系,检测软件程序中的这种缺陷。

发明内容

[0014] 本发明针对软件程序中变量的不安全使用这种缺陷模式,提供了一种检测程序异常处理模块缺陷的自动化方法,降低了软件开发的成本,提高了程序质量,减少了软件运行中可能出现的问题。
[0015] 本发明提供的软件程序中变量的不安全使用的检测方法,包括以下步骤:
[0016] 1)建立软件程序的控制流图。
[0017] 2)根据控制流图,对程序进行层次化的数据流分析,获得程序中每一个变量的操作序列。
[0018] 3)检测每个操作序列中是否出现变量的不安全使用。
[0019] 所述变量的不安全使用是指操作序列中依次出现eDef和Use,且eDef和Use之间不存在其它eDef和sDef操作时,Use为变量的不安全使用。
[0020] 所述软件程序中包括正常程序语句和警戒区域还包括异常处理模块或/和finally模块。
[0021] 所述控制流图的建立方法如下:
[0022] A、建立正常执行路径。其方法为:将每条正常程序语句设定为一个节点,按语句执行顺序,两相邻语句之间设置有向边。有向边为程序的正常执行路径,有向边的方向表示语句执行的先后顺序。
[0023] B、建立警戒区域内部执行路径。其方法为:将警戒区域内的每条语句设定为一个节点,按照语句执行顺序,两相邻语句之间设置有向边。有向边为警戒区域内部执行路径,有向边的方向表示语句执行的先后顺序。
[0024] C、建立正常程序语句与后续警戒区域之间的有向边,有向边的方向表示语句执行的先后顺序。
[0025] D、建立异常执行路径。其方法为:若警戒区域抛出异常对象,查找与异常对象相对应的异常处理模块,若查找到,建立异常处理模块内部执行路径,并在异常对象节点与异常处理模块的第一个节点之间建立有向边;若查找不到,设置异常退出节点,建立异常对象节点指向异常退出节点的有向边。
[0026] E、查找finally模块,若查找到,建立finally模块内部执行路径;建立警戒区域最后节点和异常处理模块最后节点指向finally模块之间的有向边;建立finally模块与后续正常语句节点之间的有向边;将finally模块插入异常对象节点与异常退出节点之间,按语句执行顺序建立有向边,即按异常对象节点、finally模块和异常退出节点的顺序建立有向边;
[0027] 若查找不到,建立警戒区域最后节点指向后续正常程序语句的有向边;并建立异常处理模块最后节点指向后续正常程序语句的有向边。
[0028] 建立异常处理模块内部执行路径的方法为:将异常处理模块内的每条语句设定为一个节点,按照语句执行顺序,两相邻语句之间设置有向边。有向边为异常处理模块内部执行路径,有向边的方向表示语句执行的先后顺序。
[0029] 建立finally模块内部执行路径的方法为:将finally模块内的每条语句设定为一个节点,按照语句执行顺序,两相邻语句之间设置有向边。有向边为finally模块内部执行路径,有向边的方向表示语句执行的先后顺序。
[0030] 所述与异常对象相对应的异常处理模块是指该异常处理模块参数的异常类型与异常对象的类型相同,或异常处理模块参数的异常类型是异常对象的父类型。
[0031] 所述警戒区域为try语句块;所述异常处理模块为catch语句块。
[0032] 所述第2)步的执行方法如下:
[0033] A、确定控制流图中对变量进行操作的节点的变量操作类型;
[0034] B、遍历控制流图,为控制流图中每一条执行路径上的每一个变量生成操作序列。
[0035] 所述变量操作类型为sDef,eDef,Use,以如何改变变量的状态为三种操作类型的定义依据。在程序中,变量的类型有两种:基本数据类型和抽象数据类型。对于基本数据类型,如:整型、浮点型、布尔型的变量,变量状态是指这个变量的值。而对于抽象数据类型的变量,变量状态由其属性决定,例如:对象的状态由其成员变量的状态决定。操作作用于变量,按照是否改变变量状态,操作可分为两类:
[0036] 定义(Define),如果操作改变了变量的状态,那么这个操作是一个定义操作,它发生在改变了变量状态的语句中。例如:对变量的赋值,是对这个变量的定义操作。对于抽象数据类型的变量,如果操作改变了其任意一个属性的值,则这个操作是对该变量的定义操作。
[0037] 使用(Use),如果操作没有改变变量的状态,只是引用它,那么这个操作是对该变量的使用操作。对于抽象数据类型的变量,如果变量所有属性的状态都没有被改变,那么这个操作是对该变量的使用操作。
[0038] 由于软件运行时可能发生异常,定义操作执行时可能失效,使变量的状态无法被成功的改变。因此,定义操作会出现两类:成功地改变了变量状态的操作是成功定义操作(sDef),而由于定义操作执行过程中出现异常导致变量定义不成功的操作为异常定义操作(eDef)。
[0039] 所述变量的操作序列是指在控制流图的一条执行路径上,顺次出现的对该变量进行操作的操作类型的序列。
[0040] 所述第3)步的执行方法如下:
[0041] 检测每一个变量的操作序列,确定序列中是否出现相邻的eDef和Use,若序列中依次出现相邻的eDef、Use操作,则该Use操作为对该变量的不安全使用。
[0042] 所述的程序为Java程序。
[0043] 所述“变量的不安全使用”是指在一个变量的操作序列中,变量的使用操作(Use)之前存在一个异常定义操作(eDef),且它和这个异常定义操作(eDef)之间不存在任何其它的定义(Define)操作。在程序的执行路径上,同一变量的操作序列中,不同的定义操作(Define)类型,会出现不同的变量使用。当变量的使用操作之前存在的定义操作是成功定义操作(sDef)时,则是对变量安全的使用;而当变量的使用操作之前存在一个异常定义操作(eDef),且它和这个异常定义操作之间不存在任何其它的定义操作,就出现了变量的不安全使用。可以形式化的描述如下:令O={sDef,eDef,Use}是对变量的操作集合。S(v)=<a1,a2,...,ak>是程序中一条执行路径上对变量v的操作序列,其中ai∈O(1≤i≤k)。如果ap=eDef,aq=Use,1≤p<q≤k,且 ,p<j<q,aj≠sDef,aj≠eDef,那么aq是由ap异常引起的对变量v的不安全的使用,它破环了程序应当具有的依赖安全的属性。
[0044] 由于变量不安全的使用难以用现有的软件分析和测试技术发现,程序往往继续错误运行,导致产生新的异常,引起非预期的程序终止,或生成错误的输出结果。因此,需要尽早检测出这种不安全的变量使用,尤其是必须在软件开发的早期就发现这样的缺陷,以减少开发成本,保证程序的正常运行。
[0045] 本发明的有益效果:
[0046] 本发明所提出的软件程序中不安全的变量使用的检测方法,能快速检测到不安全的变量使用,运用在程序软件的开发早期,能及早发现程序中的缺陷,改善代码质量,提高软件的可靠性,降低软件开发成本。

附图说明

[0047] 图1是本发明检测方法的流程框图;
[0048] 图2是建立控制流图的方法的流程框图;
[0049] 图3是对控制流图进行层次化的数据流分析的流程框图;
[0050] 图4是由实施例1的示例程序片段生成的控制流图;
[0051] 图5是在图4的基础上标明了变量操作类型的控制流图;
[0052] 图6是由实施例2的示例程序片段生成的控制流图;
[0053] 图7是在图6的基础上标明了变量操作类型的控制流图;
[0054] 图8是由实施例3的示例程序片段生成的控制流图;
[0055] 图9是在图8的基础上标明了变量操作类型的控制流图。

具体实施方式

[0056] 下面根据实施例和附图详细说明本发明的方法。
[0057] 实施例1
[0058] 表1是一段Java程序,该程序中除正常程序语句外,还包括try语句块、catch语句块和finally模块,try语句块为警戒区域,catch语句块为异常处理模块。在程序运行时,程序第4行和第5行语句可能出现异常,若第5行语句执行过程中抛出类型为IOException的异常对象,此时控制流将转移到第8行的语句,而使第5行对变量str的赋值失效。程序继续执行下去,在第14行通过调用str.length()方法使用了变量str,此处是对变量str的不安全使用。由于第5行中对str的赋值不成功,str的值仍为null,因此第14行语句中使用str时程序会抛出类型为NullPointerException的异常,导致非预期的程序退出。
[0059] 表1 实施例1的示例程序片段表
[0060]
[0061] 为了防止这种情况,需要使用本发明所提供的检测方法来检测这种变量的不安全使用。本发明检测方法的总体流程参见图1,
[0062] S101,建立程序的控制流图。
[0063] S102,根据控制流图,对程序进行层次化的数据流分析,获得程序中每条执行路径上每个变量的操作序列。
[0064] S103,检测每个操作序列中是否出现变量的不安全使用。
[0065] 具体实施方式如下:
[0066] S101,建立表1的程序的控制流图,建立方法参见图2,所得到的控制流图见图4,包括如下步骤:
[0067] A、建立正常的执行路径。将表1程序片段中的第1、2语句设置为节点,并用行号标记;建立节点1指向节点2的有向边;将第14行语句设置为节点14。有向边表示程序的正常执行路径。
[0068] B、建立警戒区域try语句块内部的执行路径。将try语句块中第3-7行的每行语句都设置为节点。try语句块内部语句的执行顺序为:从第3行语句开始,顺序执行到第7句。因此,建立从节点3指向节点4、节点4指向节点5、节点5指向节点6、节点6指向节点7的有向边,有向边表示警戒区域内部程序的执行路径。
[0069] C、建立正常程序语句与后续警戒区域之间的有向边,即建立节点2指向节点3的有向边。
[0070] D、建立异常执行路径。查找与异常对象相对应的异常处理模块,在本实施例中,节点4抛出的异常对象类型为SQLException,程序中没有相应的异常处理模块,则建立一个异常退出节点,在节点4和异常退出节点间建立有向边;节点5抛出的异常对象类型为IOException,有相应的异常处理模块catch语句块8-10行,建立异常处理模块内部执行路径,即语句8-10中的每一行都设置为节点,建立节点8指向节点9、节点9指向节点10的有向边。同时在出现异常对象的节点5与异常处理模块的第一个节点8之间建立有向边。
[0071] 在Java程序中,程序抛出异常的方式有两种:一是由throw子句直接生成异常对象并抛出。一是在方法调用的过程中,由于方法定义中包含throws部分,因此间接抛出异常,如节点4、5。在表1所示的程序片段中,警戒区域内节点5调用了类对象br的成员函数readLile(),在这个方法的声明中包含“throws IOException”,表示程序可能抛出类型为IOException的异常对象。程序片段中包含一个catch模块,且catch模块参数的异常类型为IOException,类型相同。因此建立节点5指向节点8的有向边。
[0072] E、查找finally模块,本实施例中有finally模块11-13行,
[0073] 首先建立finally模块内部执行路径,分别为第11、12、13行语句建立节点,并用行号标记。建立节点11指向节点12、节点12指向节点13的有向边;
[0074] 其次建立警戒区域最后节点7与finally模块的开始节点节点11之间的有向边;
[0075] 第三建立异常处理模块最后节点10与finally模块节点11之间的有向边;
[0076] 第四建立finally模块与后续正常语句节点之间的有向边,即建立节点13指向节点14的有向边。
[0077] 最后在出现异常对象的节点4和异常退出节点之间插入finally模块,并根据语句执行顺序设置有向边。finally模块的插入可以在节点4和异常退出节点之间复制finally模块11-13,删除节点4指向异常退出节点的有向边,并建立节点4指向节点11,节点11指向节点12,节点12指向节点13,节点13指向异常退出节点之间的有向边,如图4所示。
[0078] 本实施例建立完成的控制流图参见图4。
[0079] S102,根据控制流图,对程序进行层次化的数据流分析,获得程序每条执行路径上每一个变量的操作序列,参见图3和图5,具体步骤如下:
[0080] A、首先确定控制流图中对变量进行操作的节点的变量操作类型;所述变量操作类型是sDef,或eDef或Use;节点1,为s赋了初值null,是对变量s的定义操作,且定义过程中不会出现异常,因此节点1对s的变量操作类型为sDef。节点2同理为对变量srt的sDef。节点4,对变量s赋值,是对变量s的定义,在正常执行路径上,将s归入sDef集合,在异常执行路径中,将s归入eDef集合。节点5,对变量str赋值,是对变量str的定义,在正常执行路径上,将str归入sDef,在异常路径上,将str归入eDef集合。节点6,以变量s为参数,没有改变s的值,是对s的使用,将s归入Use集合。节点14,调用了str的成员函数length(),是对str的使用,将str归入Use集合。在图4的控制流图上标记变量操作类型,见图5。
[0081] B、遍历控制流图,为控制流图中每一条执行路径上的每一个变量生成相应的操作序列。以变量s和str为例,它的操作序列如表2所示。
[0082] 表2 实施例1变量的操作序列表
[0083]
[0084] S103,检测变量的不安全使用。具体步骤如下:
[0085] A、在表2中的变量str的3个操作序列中,第三条操作序列出现了相邻的eDef和Use,出现了不安全变量的使用。
[0086] B、定位该Use操作所在节点,为节点14,输出节点14。
[0087] 对于变量s,它的操作序列中没有出现连续的eDef和Use操作,因此没有对变量的不安全使用。若节点4抛出异常,则是对变量s的eDef操作。节点6是对变量s的使用,但当节点4抛出异常后,操作序列如第二行所示,节点6被跳过而没有执行,因此不会出现对变量的不安全使用。如果运行程序,此时程序将退出,程序员会立即知道程序异常并进行处理。
[0088] 这样就检测到了程序中变量的不安全使用。
[0089] 当检测到程序变量的不安全使用,程序员可以修改程序,在保持程序逻辑功能的同时,消除对变量的不安全使用,提高代码质量。
[0090] 实施例2
[0091] 表3是一段Java程序,该程序包括正常程序语句、try语句块和finally模块,不含catch语句块,try语句块为警戒区域。
[0092] 表3 实施例2的示例程序片段表
[0093]
[0094] 检测表3程序的不安全变量的使用的方法为:
[0095] S101,建立表3的程序的控制流图
[0096] A、建立正常执行路径。将表3程序片段中的第1、2语句设置为节点,并用行号标记;建立节点1指向节点2的有向边;将第14行语句设置为节点14。
[0097] B、建立警戒区域try语句块内部执行路径。将try语句块中第3-7行的每行语句都设置为节点。try语句块内部语句的执行顺序为:从第3行语句开始,顺序执行到第7句。因此,建立从节点3指向节点4、节点4指向节点5、节点5指向节点6、节点6指向节点7的有向边,有向边表示警戒区域内部程序的执行路径。
[0098] C、建立正常程序语句与后续警戒区域之间的有向边,即建立节点2指向节点3的有向边。
[0099] D、建立异常执行路径。查找与异常对象相对应的异常处理模块,在本实施例中,没有异常处理模块,即catch语句块。
[0100] 相对于节点4建立一个异常退出节点,相对于节点5建立一个异常退出节点;节点4和节点5分别与对应的异常退出节点之间建立有向边。
[0101] E、查找finally模块,本实施例中有finally模块11-13行,
[0102] 首先建立finally模块内部执行路径,分别为第11、12、13行语句建立节点,并用行号标记。建立节点11指向节点12、节点12指向节点13的有向边;
[0103] 其次建立警戒区域最后节点7与finally模块的11节点之间的有向边;
[0104] 第三建立finally模块与后续正常语句节点之间的有向边,即建立节点13指向节点14的有向边。
[0105] 最后在出现异常对象的节点4和异常退出节点之间插入finally模块,并根据语句执行顺序设置有向边。finally模块的插入可以在节点4和异常退出节点之间复制finally模块11-13,删除节点4指向异常退出节点之间的有向边,并建立节点4指向节点11,节点11指向节点12,节点12指向节点13,节点13指向异常退出节点之间的有向边。节点5与异常退出节点之间也插入finally模块,方法同节点4,生成的控制流图参见图6。
[0106] S102,根据控制流图,对程序进行层次化的数据流分析,获得程序每条执行路径上每一个变量的操作序列,具体步骤与实施例1相同,在此不再赘述。可参见图7和表4。图7是在图6的控制流图上直观标明了变量的操作类型,表4则显示了该控制流图上每一条执行路径上的每一个变量的操作序列。
[0107] 表4 实施例2变量的操作序列表
[0108]
[0109] S103,检测变量的不安全使用。
[0110] 在表4中的变量s和str的操作序列中,没有出现相邻的eDef和Use,也就是说没有出现了变量的不安全使用。
[0111] 实施例3
[0112] 表5是一段Java程序,该程序包括正常程序语句、try语句块和catch语句块,不含finally模块,catch语句块为异常处理模块,try语句块为警戒区域。
[0113] 表5 实施例3的示例程序片段表
[0114]
[0115] 检测表5程序的不安全变量的使用的方法为:
[0116] S101,建立表5的程序的控制流图
[0117] A、建立正常执行路径。将表4程序片段中的第1、2语句设置为节点,并用行号标记;建立节点1指向节点2的有向边;将第14行语句设置为节点14。
[0118] B、建立警戒区域try语句块内部执行路径。将try语句块中第3-7行的每行语句都设置为节点。try语句块内部语句的执行顺序为:从第3行语句开始,顺序执行到第7句。因此,建立从节点3指向节点4、节点4指向节点5、节点5指向节点6、节点6指向节点7的有向边,有向边表示警戒区域内部程序的执行路径。
[0119] C、建立正常程序语句与后续警戒区域之间的有向边,即建立节点2指向节点3的有向边。
[0120] D、建立异常执行路径。查找与异常对象相对应的异常处理模块,在本实施例中,节点4抛出的异常对象类型为SQLException,没有相应的异常处理模块,则建立一个异常退出节点,在节点4和异常退出节点间建立有向边;节点5抛出的异常对象有相应的异常处理模块catch语句块8-10行,建立异常处理模块内部执行路径,即语句8-10中的每一行都设置为节点,建立节点8指向节点9、节点9指向节点10的有向边。同时还在出现异常对象的节点5与异常处理模块的第一个节点8之间建立有向边。
[0121] E、查找finally模块,本实施例中没有finally模块。
[0122] 建立警戒区域最后节点7指向后续正常程序语句节点14的有向边,并建立异常处理模块最后节点10指向后续正常程序语句节点14的有向边。
[0123] 图8为建立完成的控制流图。
[0124] S102,根据控制流图,对程序进行层次化的数据流分析,获得程序每条执行路径上每一个变量的操作序列,具体步骤与实施例1相同,在此不再赘述。可参见图9和表6。图9是在图8的控制流图上直观标明了变量的操作类型,表6则显示了该控制流图上每一条执行路径上的每一个变量的操作序列。
[0125] 表6 实施例3变量的操作序列表
[0126]
[0127] S103,检测变量的不安全使用。具体步骤如下:
[0128] A、在表6中的变量str的3个操作序列中,第三条操作序列出现了相邻的eDef和Use,出现了变量的不安全使用。
[0129] B、定位该Use操作所在节点,为节点14,输出节点14。