一种基于代码静态分析的多线程死锁检测方法及系统的制作方法

文档序号:6341309阅读:320来源:国知局
专利名称:一种基于代码静态分析的多线程死锁检测方法及系统的制作方法
技术领域
本发明涉及软件测试技术,尤其涉及一种基于代码静态分析的多线程死锁检测方 法及系统。
背景技术
软件测试是在软件投入运行前,对软件需求分析、设计规格说明和编码实现的最 终审查,是软件质量保证的关键步骤。软件测试是为了发现错误而执行程序的过程,在一个 可控的软件测试环境中分析或执行程序,其根本目的是以尽可能少的时间和人力发现并改 正软件中潜在的各种故障及缺陷,提高软件的质量。从测试过程是否需要运行被测软件的角度,可将软件测试方法分为两大类动态 测试法和静态测试法。所谓动态测试,就是通过运行软件来检验软件的动态行为和运行结 果的正确性。而静态测试的基本特征是在对软件进行分析、检查和测试时不实际运行被测 试的程序。动态测试和静态测试各有其优缺点动态测试的优点是发现的软件错误非常 直观,缺点是对测试用例的设计要求高,不同的测试用例集合发现错误的能力差别很大,另 外,由于动态测试法需要实际运行被测程序也是一个限制。而动态测试的缺点恰恰是静态 测试的优点,静态测试不需要实际运行被测程序,不需要设计相关的测试用例,容易自动 化。静态测试的缺点是发现的问题往往不能完全自动确定为真正的错误,需要人工确认, 所以静态测试又被称作静态分析。从可计算性理论的角度来看,静态分析是一个不可判定问题。提高精度是静态 测试的核心问题,提高精度通常包括两个方面减少误报(false positive)和减少漏报 (false negative) 0由于大量的误报会使人对测试失去信心,而漏报则会造成程序具有较 高质量的假象。静态测试过程中,造成静态分析不精确的本质在于缺少程序动态执行信息, 因此,怎样更好地近似表示和计算程序动态执行信息是提高精度的关键。在现代软件的开发中,并发程序以其资源利用率高、计算速度快等优点在实际应 用中得到了广泛应用。并发行为的复杂性及不确定性,使得其开发、测试与维护比一般软件 的开发更困难。死锁是最为典型的并发安全问题。据统计,Sun公司的缺陷数据库中,大约有3% 的缺陷与死锁相关。死锁一旦发生,会导致程序无法正常终止,严重的会导致系统崩溃。检 测或修正死锁问题是非常困难的,由于线程运行的状态空间过大,检测中不可能测试到程 序中线程交错的所有可能。如果程序发生了死锁,想要重现死锁还存在一定的问题,即死锁 具有偶发性。此外,修复其他并发问题(例如数据竞争)会引入新的同步,可能导致新的 死锁出现。

发明内容
有鉴于此,本发明的主要目的在于提供一种基于代码静态分析的多线程死锁检测 方法及系统,能对Java编写的程序进行有效的死锁检测,以提高测试精度和自动化程度。
为达到上述目的,本发明的技术方案是这样实现的一种基于代码静态分析的多线程死锁检测方法,该方法包括如下步骤A、读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成待 测软件的抽象语法树和控制流图;B、遍历所生成的抽象语法树,对待测软件源程序中的变量进行别名分析,生成指 向分析图,得到变量别名关系;C、遍历所生成的抽象语法树,对待测软件源程序中的线程类进行分析,分析线程 并发特征,创建线程类并发特征集合;D、遍历控制流图,生成当前待测软件程序元素的路径,收集可达路径中的线程的 并发特征,生成线程锁特征集合;E、遍历线程锁特征集合,生成程序占有请求特征集合和程序锁图,对占有请求特 征集和锁图进行分析,生成潜在死锁集合;F、遍历线程锁特征集合,生成锁对象的门锁集合,分析潜在死锁集合中的死锁,分 析不同的锁对象,删除存在相同门锁对象的情况;G、遍历控制流图,对当前待测软件程序进行并发和逃逸分析,删除潜在死锁集合 中不能并发的死锁,得到最终死锁集合。其中,所述步骤B进一步包括Bi、根据用户给出的待测软件程序元素,通过遍历抽象语法树生成软件程序的指 向分析图;具体为根据用户给出的待测软件程序元素,通过遍历抽象语法树,找到对象创 建语句,在指向分析图中创建对象节点;通过遍历抽象语法树,创建变量节点,并创建变量 节点指向对象的边和对象域指向对象的边B2、计算变量指向的对象,分析变量别名关系。所述步骤C进一步包括Cl、通过遍历抽象语法树,找到程序中的线程类;C2、对线程类进行分析,分析线程并发特征;包括分析线程类的加锁特征,创建 线程并发特征森林;将线程类的并发特征存入线程类并发特征集合;C3、生成线程类并发特征集合。所述步骤D进一步包括D1、遍历控制流图,计算程序的可达路径;具体为对控制流的分析以函数为单位 进行;函数过程间调用关系根据函数调用关系图,按照调用关系的拓扑逆序进行;D2、对可达路径上的线程进行分析,收集线程的并发特征;具体为对于直接声明 的线程类对象,对步骤C中得到的线程类并发特征集合进行查询,创建线程并发特征,存入 线程并发特征集;对新创建的线程,进行锁特征分析,生成线程并发特征,存入线程并发特 征集;D3、生成线程并发特征集合。所述步骤E进一步包括E1、对步骤D中生成的线程并发特征集进行占有请求特征分析,生成占有请求特 征集;具体为对每个线程并发特征进行分析,生成占有请求特征对,存入占有请求特征集 合;
E2、对步骤D中生成的线程并发特征集进行分析,生成程序锁图;E3、对步骤El中生成的占有请求特征集进行分析,找到潜在的死锁对,存入潜在 的死锁对集合,生成潜在死锁对集合;E4、对步骤El中生成的锁图进行分析,找到存在的环路作为潜在死锁环,存入潜 在的死锁环集合,生成潜在死锁环集合。其中,所述步骤E2进一步包括E21、创建程序锁图,将线程并发特征集中的每个 线程并发特征的特征森林中的结点和边添加到锁图中;E22、通过步骤B中的指向分析图对 锁图中不同线程的结点进行别名分析,在互为别名的结点间加边。其中,所述步骤E3进一步包括E31、通过步骤B中的指向分析图对不同线程中的 变量进行别名分析;E32、对步骤El中生成的占有请求特征集中的占有请求特征进行笛卡 尔积分析,对不同线程的占有请求特征进行分析,如果线程1的占有的锁与线程2请求的锁 互为别名,同时线程1请求的锁与线程2请求的锁互为别名,则作为潜在死锁对,存入潜在 死锁对集合。所述步骤F进一步包括F1、对每一个线程并发特征进行分析,分析每个锁获得前需要获得锁,即门锁,生 成锁对象的门锁集合;F2、对步骤E中生成的潜在死锁集合中的死锁对和死锁环进行分析,分析每一个 死锁对或者死锁环,如果一个死锁中,不同线程的两个锁对象具有相同的门锁对象,则不能 构成死锁,从死锁集合中删除;F3、更新潜在死锁集合。所述步骤G进一步包括G1、遍历控制流图,对步骤D中生成的线程并发特征集合进行分析,分析线程是否 可以并发;G2、对步骤F中更新后的潜在死锁集合进行分析,分析每一个死锁中的线程是否 能够并发,如果不能,则删除死锁,更新潜在死锁集合;G3、对步骤G2中更新后的潜在死锁集合中的死锁进行分析,分析每一个死锁中涉 及的锁对象是否为抢占的或者是否可以被多个线程并发调用;如果为抢占的,则删除该死 锁,更新潜在死锁集合;如果只能为一个线程调用,则删除该死锁,更新潜在死锁集合;G4、生成最终死锁集合。一种基于代码静态分析的多线程死锁检测系统,该系统主要包括分析模块、别名 分析模块、线程并发特征分析模块、可达分析模块和门锁分析模块以及并发与逃逸分析模 块,其中,分析模块,用于读取待测软件,对待测软件源程序进行词法分析、语法分析及语义 分析,生成抽象语法树和控制流图;别名分析模块,用于通过遍历分析模块生成的抽象语法树,对程序进行指向分析, 生成指向分析图,对变量进行别名分析;线程并发特征分析模块,用于通过遍历分析模块生成的抽象语法树,对程序中的 线程类进行线程并发特征分析,生成线程类并发特征集合;可达分析模块,用于对锁生成的控制流图进行遍历,对可达路径上的线程进行并发特征分析,生成线程并发特征集;对线程并发特征集生成的占有请求特征集和程序锁图 进行分析,生成潜在的死锁对集合和死锁环集合;门锁分析模块,用于对潜在死锁集合中的锁对象进行门锁分析,删除不同线程锁 对象存在共同门锁的死锁,更新潜在死锁集合;以及并发与逃逸分析模块,用于对线程特征集合中的线程进行并行分析,分析线程是 否可以并行执行;对死锁集中的死锁的锁进行分析,判断该锁是否是可抢占的或者该锁只 能被单独线程调用;还用于删除死锁集合中存在线程不可并发的死锁,或者锁对象可抢占, 或者锁对象只能被单独线程调用的死锁。本发明所提供的基于代码静态分析的多线程死锁检测方法及系统,具有以下优占.
^ \\\ ·应用本发明的死锁检测方法及系统,能够分析Java多线程程序中的线程并发特 征,有效地检测到可能存在的死锁,并在此基础上对检测到的死锁进行进一步的分析,借以 提高检测的精度。本发明的死锁检测方法及系统还可以有效地检测多个线程产生的死锁情 况,适用于大型软件工程项目。


图1为本发明基于代码分析的多线程死锁检测方法的实现流程示意图;图2为本发明方法中可达分析生成线程并发特征集合进行死锁检测的流程示意 图。
具体实施例方式下面结合附图及本发明的实施例对本发明的方法及系统作进一步详细的说明。本发明的基本思想是首先,读取待测软件,对待测软件源程序进行词法分析、语 法分析及语义分析,生成抽象语法树和控制流图;其次,通过遍历抽象语法树,生成程序的 指向分析图,分析变量别名关系;第三,通过遍历抽象语法树,对程序中的线程类进行分析, 生成线程类并发特征集合;第四,通过对控制流图的遍历,对程序进行可达分析,分析程序 中启动的线程,生成线程并发特征集;第五,对线程并发特征集进行分析,生成占有请求特 征集和锁图,对占有请求特征集合锁图进行分析,检测潜在的死锁;第六,对线程并发特征 进行分析,找到锁对象的门锁集合,对检测到的死锁进行分析,删除不同线程锁对象存在相 同门锁情况的死锁,更新潜在死锁集合;最后,对线程进行并发和逃逸分析,分析死锁中的 线程是否可以并发,锁是否为抢占或是否能被多个线程调用,删除不可能的死锁情况,得到 最终的死锁集合。本发明的基于代码静态分析的多线程死锁检测系统介绍如下,该系统主要包括分 析模块、别名分析模块、线程并发特征分析模块、可达分析模块和门锁分析模块以及并发与 逃逸分析模块。其中,分析模块,用于读取待测软件,对待测软件源程序进行词法分析、语法分析及语义 分析,生成抽象语法树和控制流图。别名分析模块,用于通过遍历分析模块生成的抽象语法树,对程序进行指向分析, 生成指向分析图,对变量进行别名分析。
线程并发特征分析模块,用于通过遍历分析模块生成的抽象语法树,对程序中的 线程类进行线程并发特征分析,生成线程类并发特征集合。可达分析模块,用于对锁生成的控制流图进行遍历,对可达路径上的线程进行并 发特征分析,生成线程并发特征集。对线程并发特征集生成的占有请求特征集和程序锁图 进行分析,生成潜在的死锁对集合和死锁环集合。门锁分析模块,用于对潜在死锁集合中的锁对象进行门锁分析,删除不同线程锁 对象存在共同门锁的死锁,更新潜在死锁集合。并发与逃逸分析模块,用于对线程特征集合中的线程进行并行分析,分析线程是 否可以并行执行;对死锁集中的死锁的锁进行分析,判断该锁是否是可抢占的或者该锁只 能被单独线程调用。删除死锁集合中存在线程不可并发的死锁,或者锁对象可抢占,或者锁 对象只能被单独线程调用的死锁。图1为本发明基于代码分析的多线程死锁检测方法的实现流程示意图,如图1所 示,该方法包括以下步骤步骤1、读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生 成待测软件的抽象语法树和控制流图。步骤2、遍历所生成的抽象语法树,对待测软件源程序中的变量进行别名分析,生 成指向分析图,得到变量别名关系。步骤3、遍历所生成的抽象语法树,对待测软件源程序中的线程类进行分析,分析 线程并发特征,生成线程类并发特征集合。步骤4、遍历控制流图,生成当前待测软件程序元素的路径,收集可达路径中的线 程的并发特征,生成线程锁特征集合。步骤5、遍历线程锁特征集合,生成程序占有请求特征集合和程序锁图,对占有请 求特征集和锁图进行分析,生成潜在死锁集合。步骤6、遍历线程锁特征集合,生成锁对象的门锁集合,分析潜在死锁集合中死锁, 删除不同线程锁对象存在相同门锁的情况。步骤7、遍历控制流图,对当前待测软件程序进行并发和逃逸分析,删除潜在死锁 集合中不能并发的死锁,得到检测到的死锁集合。其中,所述步骤1进一步包括步骤11、读取待测软件源程序,对待测软件源程序进行词法分析;对待测的软件进行词法分析(Lexical analysis),该词法分析为后续形成语法树 提供所需要的符号结点,如常量和名字。步骤12、在步骤11的基础上,对待测软件源程序进行语法分析及语义分析,生成 抽象语法树;对待测软件进行语法分析(Parsing),所述语法分析提供了含有代表相应语法结 构的中间结点的语法树,该语法树包括表示非保留字终结符的叶子结点和表示语法结构的 中间结点;语义分析(Semantic analysis)对名字和作用域进一步进行处理,生成抽象语 法树,该抽象语法树包括表示类型信息的对象和符号表,并将它们连接成树形结构,这是编 译器前端的最根本的输出,抽象语法树包含所有的从源代码所得到的相关信息,并且能够 完全体现源程序的语法结构。
上述抽象语法树具有一致的结构模式,由不同类型的节点组成,每一类节点都被 描述成一个类结构。所有的语法树结点都支持一个统一的访问者模式接口,这样就能很方 便地对抽象语法树通过访问者模式进行进一步的不同形式的加工、遍历访问和输出。步骤13、在所生成抽象语法树的基础上生成控制流图;这个过程是一个遍历抽象语法树的过程。通常,一个程序控制流图可表示为(N, E, Entry, Exit) 0其中,N代表结点的集合,反映程序中的语句和条件判断;E代表有向边的 集合,反映程序中语句间的控制流关系;Entry为程序固定的唯一入口结点;Exit为程序唯 一的退出结点。简单地说控制流图就是具有单一、固定入口结点和出口结点的有向图。步骤2进一步包括步骤21、通过遍历抽象语法树,识别对象创建语句,在指向分析图中创建对象结占.
^ \\\ 步骤22、通过遍历抽象语法树,识别程序中的变量,创建变量节点;识别出程序中的全局变量、静态变量、函数参数和局部变量。步骤23、根据变量的指向关系在指向分析图中创建指向边。一个程序的指向分析图可表示为(R,0,F,RE, 0E)。其中R表示变量结点,0表示 对象结点,F表示类的实例域,RE表示变量指向对象的边,OE表示对象的域f指向另一个对 象。简单的说,指向分析图就是表示程序变量指向关系的有向图。步骤3进一步包括步骤31、通过遍历抽象语法树,识别程序中的线程类。步骤32、对程序中的线程类进行分析,生成线程类的并发特征。步骤33、收集线程类并发特征生成线程类并发特征集合。线程并发特征就是线程的加锁特征,主要识别三种加锁特征1)同步块(synchronized (Object lock) {});2)同步方法(synchronized method ());3)对象依赖关系,主要是Wait()、n0tify()和notifyAllO等方法。方法中用森 林的结构表示线程的并发特征,其中树的结构表示线程加锁的顺序。例如示例代码
加锁特征森林
权利要求
1.一种基于代码静态分析的多线程死锁检测方法,其特征在于,该方法包括如下步骤A、读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成待测软 件的抽象语法树和控制流图;B、遍历所生成的抽象语法树,对待测软件源程序中的变量进行别名分析,生成指向分 析图,得到变量别名关系;C、遍历所生成的抽象语法树,对待测软件源程序中的线程类进行分析,分析线程并发 特征,创建线程类并发特征集合;D、遍历控制流图,生成当前待测软件程序元素的路径,收集可达路径中的线程的并发 特征,生成线程锁特征集合;E、遍历线程锁特征集合,生成程序占有请求特征集合和程序锁图,对占有请求特征集 和锁图进行分析,生成潜在死锁集合;F、遍历线程锁特征集合,生成锁对象的门锁集合,分析潜在死锁集合中的死锁,分析不 同的锁对象,删除存在相同门锁对象的情况;G、遍历控制流图,对当前待测软件程序进行并发和逃逸分析,删除潜在死锁集合中不 能并发的死锁,得到最终死锁集合。
2.根据权利要求1所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所 述步骤B进一步包括Bi、根据用户给出的待测软件程序元素,通过遍历抽象语法树生成软件程序的指向分 析图;具体为根据用户给出的待测软件程序元素,通过遍历抽象语法树,找到对象创建语 句,在指向分析图中创建对象节点;通过遍历抽象语法树,创建变量节点,并创建变量节点 指向对象的边和对象域指向对象的边B2、计算变量指向的对象,分析变量别名关系。
3.根据权利要求1所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所 述步骤C进一步包括Cl、通过遍历抽象语法树,找到程序中的线程类;C2、对线程类进行分析,分析线程并发特征;包括分析线程类的加锁特征,创建线程 并发特征森林;将线程类的并发特征存入线程类并发特征集合;C3、生成线程类并发特征集合。
4.根据权利要求1所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所 述步骤D进一步包括D1、遍历控制流图,计算程序的可达路径;具体为对控制流的分析以函数为单位进 行;函数过程间调用关系根据函数调用关系图,按照调用关系的拓扑逆序进行;D2、对可达路径上的线程进行分析,收集线程的并发特征;具体为对于直接声明的线 程类对象,对步骤C中得到的线程类并发特征集合进行查询,创建线程并发特征,存入线 程并发特征集;对新创建的线程,进行锁特征分析,生成线程并发特征,存入线程并发特征 集;D3、生成线程并发特征集合。
5.根据权利要求1所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所述步骤E进一步包括E1、对步骤D中生成的线程并发特征集进行占有请求特征分析,生成占有请求特征集; 具体为对每个线程并发特征进行分析,生成占有请求特征对,存入占有请求特征集合; E2、对步骤D中生成的线程并发特征集进行分析,生成程序锁图; E3、对步骤El中生成的占有请求特征集进行分析,找到潜在的死锁对,存入潜在的死 锁对集合,生成潜在死锁对集合;E4、对步骤El中生成的锁图进行分析,找到存在的环路作为潜在死锁环,存入潜在的 死锁环集合,生成潜在死锁环集合。
6.根据权利要求5所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所 述步骤E2进一步包括E21、创建程序锁图,将线程并发特征集中的每个线程并发特征的特征森林中的结点和 边添加到锁图中;E22、通过步骤B中的指向分析图对锁图中不同线程的结点进行别名分析,在互为别名 的结点间加边。
7.根据权利要求5所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所 述步骤E3进一步包括E31、通过步骤B中的指向分析图对不同线程中的变量进行别名分析; E32、对步骤El中生成的占有请求特征集中的占有请求特征进行笛卡尔积分析,对不 同线程的占有请求特征进行分析,如果线程1的占有的锁与线程2请求的锁互为别名,同时 线程1请求的锁与线程2请求的锁互为别名,则作为潜在死锁对,存入潜在死锁对集合。
8.根据权利要求1所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所 述步骤F进一步包括F1、对每一个线程并发特征进行分析,分析每个锁获得前需要获得锁,即门锁,生成锁 对象的门锁集合;F2、对步骤E中生成的潜在死锁集合中的死锁对和死锁环进行分析,分析每一个死锁 对或者死锁环,如果一个死锁中,不同线程的两个锁对象具有相同的门锁对象,则不能构成 死锁,从死锁集合中删除; F3、更新潜在死锁集合。
9.根据权利要求1所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所 述步骤G进一步包括G1、遍历控制流图,对步骤D中生成的线程并发特征集合进行分析,分析线程是否可以 并发;G2、对步骤F中更新后的潜在死锁集合进行分析,分析每一个死锁中的线程是否能够 并发,如果不能,则删除死锁,更新潜在死锁集合;G3、对步骤G2中更新后的潜在死锁集合中的死锁进行分析,分析每一个死锁中涉及的 锁对象是否为抢占的或者是否可以被多个线程并发调用;如果为抢占的,则删除该死锁,更 新潜在死锁集合;如果只能为一个线程调用,则删除该死锁,更新潜在死锁集合; G4、生成最终死锁集合。
10.一种基于代码静态分析的多线程死锁检测系统,其特征在于,该系统主要包括分析模块、别名分析模块、线程并发特征分析模块、可达分析模块和门锁分析模块以及并发与逃 逸分析模块,其中,分析模块,用于读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分 析,生成抽象语法树和控制流图;别名分析模块,用于通过遍历分析模块生成的抽象语法树,对程序进行指向分析,生成 指向分析图,对变量进行别名分析;线程并发特征分析模块,用于通过遍历分析模块生成的抽象语法树,对程序中的线程 类进行线程并发特征分析,生成线程类并发特征集合;可达分析模块,用于对锁生成的控制流图进行遍历,对可达路径上的线程进行并发特 征分析,生成线程并发特征集;对线程并发特征集生成的占有请求特征集和程序锁图进行 分析,生成潜在的死锁对集合和死锁环集合;门锁分析模块,用于对潜在死锁集合中的锁对象进行门锁分析,删除不同线程锁对象 存在共同门锁的死锁,更新潜在死锁集合;以及并发与逃逸分析模块,用于对线程特征集合中的线程进行并行分析,分析线程是否可 以并行执行;对死锁集中的死锁的锁进行分析,判断该锁是否是可抢占的或者该锁只能被 单独线程调用;还用于删除死锁集合中存在线程不可并发的死锁,或者锁对象可抢占,或者 锁对象只能被单独线程调用的死锁。
全文摘要
本发明提供一种基于代码静态分析的多线程死锁检测方法及系统,该方法包括对待测软件源程序进行词法、语法及语义分析,生成抽象语法树和控制流图;通过遍历抽象语法树,生成程序的指向分析图,对程序中的线程类进行分析,生成线程类并发特征集合;通过对控制流图的遍历,对程序进行可达分析,生成线程并发特征集并进行分析,生成占有请求特征集和锁图并进行分析,检测潜在的死锁,找到锁对象的门锁集合,删除不同线程锁对象存在相同门锁情况的死锁,更新潜在死锁集合;通过并发与逃逸分析,删除不可能的死锁情况,得到最终的死锁集合。应用本发明的方法及系统能够有效检测两个或多个线程产生死锁的情况,提高测试精度和自动化程度。
文档编号G06F11/36GK102073588SQ201010622570
公开日2011年5月25日 申请日期2010年12月28日 优先权日2010年12月28日
发明者姚欣洪, 宫云战, 杨朝红, 王雅文, 白哥乐, 肖庆, 金大海 申请人:北京邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1