CN102073588B - 一种基于代码静态分析的多线程死锁检测方法及系统 - Google Patents
一种基于代码静态分析的多线程死锁检测方法及系统 Download PDFInfo
- Publication number
- CN102073588B CN102073588B CN2010106225706A CN201010622570A CN102073588B CN 102073588 B CN102073588 B CN 102073588B CN 2010106225706 A CN2010106225706 A CN 2010106225706A CN 201010622570 A CN201010622570 A CN 201010622570A CN 102073588 B CN102073588 B CN 102073588B
- Authority
- CN
- China
- Prior art keywords
- thread
- deadlock
- lock
- concurrent
- analysis
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种基于代码静态分析的多线程死锁检测方法及系统,该方法包括:对待测软件源程序进行词法、语法及语义分析,生成抽象语法树和控制流图;通过遍历抽象语法树,生成程序的指向分析图,对程序中的线程类进行分析,生成线程类并发特征集合;通过对控制流图的遍历,对程序进行可达分析,生成线程并发特征集并进行分析,生成占有请求特征集和锁图并进行分析,检测潜在的死锁,找到锁对象的门锁集合,删除不同线程锁对象存在相同门锁情况的死锁,更新潜在死锁集合;通过并发与逃逸分析,删除不可能的死锁情况,得到最终的死锁集合。应用本发明的方法及系统能够有效检测两个或多个线程产生死锁的情况,提高测试精度和自动化程度。
Description
技术领域
本发明涉及软件测试技术,尤其涉及一种基于代码静态分析的多线程死锁检测方法及系统。
背景技术
软件测试是在软件投入运行前,对软件需求分析、设计规格说明和编码实现的最终审查,是软件质量保证的关键步骤。软件测试是为了发现错误而执行程序的过程,在一个可控的软件测试环境中分析或执行程序,其根本目的是以尽可能少的时间和人力发现并改正软件中潜在的各种故障及缺陷,提高软件的质量。
从测试过程是否需要运行被测软件的角度,可将软件测试方法分为两大类:动态测试法和静态测试法。所谓动态测试,就是通过运行软件来检验软件的动态行为和运行结果的正确性。而静态测试的基本特征是在对软件进行分析、检查和测试时不实际运行被测试的程序。动态测试和静态测试各有其优缺点:动态测试的优点是发现的软件错误非常直观,缺点是对测试用例的设计要求高,不同的测试用例集合发现错误的能力差别很大,另外,由于动态测试法需要实际运行被测程序也是一个限制。而动态测试的缺点恰恰是静态测试的优点,静态测试不需要实际运行被测程序,不需要设计相关的测试用例,容易自动化。静态测试的缺点是:发现的问题往往不能完全自动确定为真正的错误,需要人工确认,所以静态测试又被称作静态分析。
从可计算性理论的角度来看,静态分析是一个不可判定问题。提高精度是静态测试的核心问题,提高精度通常包括两个方面:减少误报(false positive)和减少漏报(false negative)。由于大量的误报会使人对测试失去信心,而漏报则会造成程序具有较高质量的假象。静态测试过程中,造成静态分析不精确的本质在于缺少程序动态执行信息,因此,怎样更好地近似表示和计算程序动态执行信息是提高精度的关键。
在现代软件的开发中,并发程序以其资源利用率高、计算速度快等优点在实际应用中得到了广泛应用。并发行为的复杂性及不确定性,使得其开发、测试与维护比一般软件的开发更困难。
死锁是最为典型的并发安全问题。据统计,Sun公司的缺陷数据库中,大约有3%的缺陷与死锁相关。死锁一旦发生,会导致程序无法正常终止,严重的会导致系统崩溃。检测或修正死锁问题是非常困难的,由于线程运行的状态空间过大,检测中不可能测试到程序中线程交错的所有可能。如果程序发生了死锁,想要重现死锁还存在一定的问题,即死锁具有偶发性。此外,修复其他并发问题(例如:数据竞争)会引入新的同步,可能导致新的死锁出现。
发明内容
有鉴于此,本发明的主要目的在于提供一种基于代码静态分析的多线程死锁检测方法及系统,能对Java编写的程序进行有效的死锁检测,以提高测试精度和自动化程度。
为达到上述目的,本发明的技术方案是这样实现的:
一种基于代码静态分析的多线程死锁检测方法,该方法包括如下步骤:
A、读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成待测软件的抽象语法树和控制流图;
B、遍历所生成的抽象语法树,对待测软件源程序中的变量进行别名分析,生成指向分析图,得到变量别名关系;
C、遍历所生成的抽象语法树,对待测软件源程序中的线程类进行分析,分析线程并发特征,创建线程类并发特征集合;
D、遍历控制流图,生成当前待测软件程序元素的路径,收集可达路径中的线程的并发特征,生成线程锁特征集合;
E、遍历线程锁特征集合,生成程序占有请求特征集合和程序锁图,对占有请求特征集和锁图进行分析,生成潜在死锁集合;
F、遍历线程锁特征集合,生成锁对象的门锁集合,分析潜在死锁集合中的死锁,分析不同的锁对象,删除存在相同门锁对象的情况;
G、遍历控制流图,对当前待测软件程序进行并发和逃逸分析,删除潜在死锁集合中不能并发的死锁,得到最终死锁集合。
其中,所述步骤B进一步包括:
B1、根据用户给出的待测软件程序元素,通过遍历抽象语法树生成软件程序的指向分析图;具体为:根据用户给出的待测软件程序元素,通过遍历抽象语法树,找到对象创建语句,在指向分析图中创建对象节点;通过遍历抽象语法树,创建变量节点,并创建变量节点指向对象的边和对象域指向对象的边
B2、计算变量指向的对象,分析变量别名关系。
所述步骤C进一步包括:
C1、通过遍历抽象语法树,找到程序中的线程类;
C2、对线程类进行分析,分析线程并发特征;包括:分析线程类的加锁特征,创建线程并发特征森林;将线程类的并发特征存入线程类并发特征集合;
C3、生成线程类并发特征集合。
所述步骤D进一步包括:
D1、遍历控制流图,计算程序的可达路径;具体为:对控制流的分析以函数为单位进行;函数过程间调用关系根据函数调用关系图,按照调用关系的拓扑逆序进行;
D2、对可达路径上的线程进行分析,收集线程的并发特征;具体为:对于直接声明的线程类对象,对步骤C中得到的线程类并发特征集合进行查询,创建线程并发特征,存入线程并发特征集;对新创建的线程,进行锁特征分析,生成线程并发特征,存入线程并发特征集;
D3、生成线程并发特征集合。
所述步骤E进一步包括:
E1、对步骤D中生成的线程并发特征集进行占有请求特征分析,生成占有请求特征集;具体为:对每个线程并发特征进行分析,生成占有请求特征对,存入占有请求特征集合;
E2、对步骤D中生成的线程并发特征集进行分析,生成程序锁图;
E3、对步骤E1中生成的占有请求特征集进行分析,找到潜在的死锁对,存入潜在的死锁对集合,生成潜在死锁对集合;
E4、对步骤E1中生成的锁图进行分析,找到存在的环路作为潜在死锁环,存入潜在的死锁环集合,生成潜在死锁环集合。
其中,所述步骤E2进一步包括:E21、创建程序锁图,将线程并发特征集中的每个线程并发特征的特征森林中的结点和边添加到锁图中;E22、通过步骤B中的指向分析图对锁图中不同线程的结点进行别名分析,在互为别名的结点间加边。
其中,所述步骤E3进一步包括:E31、通过步骤B中的指向分析图对不同线程中的变量进行别名分析;E32、对步骤E1中生成的占有请求特征集中的占有请求特征进行笛卡尔积分析,对不同线程的占有请求特征进行分析,如果线程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)。其中,N代表结点的集合,反映程序中的语句和条件判断;E代表有向边的集合,反映程序中语句间的控制流关系;Entry为程序固定的唯一入口结点;Exit为程序唯一的退出结点。简单地说:控制流图就是具有单一、固定入口结点和出口结点的有向图。
步骤2进一步包括:
步骤21、通过遍历抽象语法树,识别对象创建语句,在指向分析图中创建对象结点;
步骤22、通过遍历抽象语法树,识别程序中的变量,创建变量节点;
识别出程序中的全局变量、静态变量、函数参数和局部变量。
步骤23、根据变量的指向关系在指向分析图中创建指向边。
一个程序的指向分析图可表示为(R,O,F,RE,OE)。其中R表示变量结点,O表示对象结点,F表示类的实例域,RE表示变量指向对象的边,OE表示对象的域f指向另一个对象。简单的说,指向分析图就是表示程序变量指向关系的有向图。
步骤3进一步包括:
步骤31、通过遍历抽象语法树,识别程序中的线程类。
步骤32、对程序中的线程类进行分析,生成线程类的并发特征。
步骤33、收集线程类并发特征生成线程类并发特征集合。
线程并发特征就是线程的加锁特征,主要识别三种加锁特征:
1)同步块(synchronized(Object lock){});
2)同步方法(synchronized method());
3)对象依赖关系,主要是wait()、notify()和notifyAll()等方法。方法中用森林的结构表示线程的并发特征,其中树的结构表示线程加锁的顺序。
例如:
步骤4进一步包括:
步骤41、遍历控制流图,分析可达路径,识别程序中启动的线程。
步骤42、对启动的线程进行分析,判断该线程是否为步骤33中生成的线程类并发特征集合中线程,如果是,则执行步骤43;否则执行步骤44。
步骤43、根据线程类并发特征集合中的并发特征,创建线程并发特征。
步骤44、分析新创建的线程,收集该线程的并发特征,生成线程并发特征集合。
步骤5进一步包括:
步骤51、对步骤4中生成的线程并发特征集合进行分析,根据线程并发特征生成占有请求特征集。
所谓占有请求特征是一个三元组t<t1,h1,h2>,其含义是线程t1在h1处获得锁l1,并在h2处请求锁l2。占有请求特征集主要用来检测两个线程发生死锁的情况。
例如:
h3: synchronized(obj1)
h4: {
h5: x=1;
h6: synchronized(obj2)
h7: {
h8: y=2;
h9: }
h10: synchronized(obj3)
h11: {
h12: y=1;
h13: }
h14: }
上述程序对应的占有请求特征为<t,h3,h6>和<t,h3,h10>。
步骤52、对占有请求集进行分析,检测其中存在的死锁对。
所述死锁对为一个六元组r<t1,l1,l2,t2,l2,l1>,其含义是线程t1占有锁l1请求锁l2,同时线程t2占有锁l2请求锁l1。
步骤53、生成潜在的死锁对集合。
步骤54、根据线程并发特征生成锁图。
所谓锁图就是表示程序中加锁情况的图结构。对线程特征集进行分析构造锁图,将线程特征的锁作为锁结点,锁的顺序关系为边,通过步骤2中的指向分析图进行别名分析,在不同线程特征中相同锁对象间创建边。锁图主要用于检测多个线程发生死锁的检测。
步骤55、对锁图进行分析,检测图中存在的环作为潜在死锁环。
所述死锁环为一个n元组c<<t1,l1,l2>,<t2,l2,l3>,...,<tn,ln,l1>>,其含义是n个线程t1至tn分别占有n个锁l1至ln,并且形成等待的环。
步骤56、生成潜在死锁环集合。
步骤6进一步包括:
步骤61、对步骤42中生成的线程特征集合进行分析,对每一个线程特征中的锁对象进行分析,生成锁对象的门锁集合。
门锁(Gatelock),对于一个锁对象,在获得该锁之前需要获得的锁为这个锁对象的门锁。
步骤62、分析步骤5中生成的死锁对集合和死锁环集合中的元素,对于每个死锁,通过别名分析进行判断,如果不同线程的两个锁对象存在相同的门锁,则该死锁不能发生,删除该死锁,更新死锁对集合和死锁环集合。
步骤7进一步包括:
步骤71、对步骤42中生成的线程特征集合进行分析,分析其中的线程是否可以并发执行。
步骤72、对步骤62中更新后的死锁对集合和死锁环集合中的元素进行分析,如果死锁中的任意两个或多个线程不能并发执行,则死锁不能发生,删除该死锁,更新死锁对集合和死锁环集合。
步骤73、对上述步骤72中更新的死锁对集合和死锁环集合,对每个死锁中的每个锁进行判断,判断该锁是否可抢占或者是否可以为多个线程并发调用。如果为可抢占锁或者不能被多个线程并发调用,则该死锁不能发生,删除该死锁,更新死锁对集合和死锁环集合。
由上述的结果可知,由于本发明的静态死锁检测方法收集程序的线程并发特征,通过占有请求特征集和锁图两种方式进行死锁检测,并逐步深入分析提高检测精度,所以具备漏报少、测试精度高等特点。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
Claims (1)
1.一种基于代码静态分析的多线程死锁检测方法,其特征在于,该方法包括如下步骤:
A、读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成待测软件的抽象语法树和控制流图;
B、遍历所生成的抽象语法树,对待测软件源程序中的变量进行别名分析,生成指向分析图,得到变量别名关系;包括:B1、根据用户给出的待测软件程序元素,通过遍历抽象语法树生成软件程序的指向分析图;具体为:根据用户给出的待测软件程序元素,通过遍历抽象语法树,找到对象创建语句,在指向分析图中创建对象节点;通过遍历抽象语法树,创建变量节点,并创建变量节点指向对象的边和对象域指向对象的边;B2、计算变量指向的对象,分析变量别名关系;
C、遍历所生成的抽象语法树,对待测软件源程序中的线程类进行分析,分析线程并发特征,创建线程类并发特征集合;包括:C1、通过遍历抽象语法树,找到程序中的线程类;C2、对线程类进行分析,分析线程并发特征;包括:分析线程类的加锁特征,创建线程并发特征森林;将线程类的并发特征存入线程类并发特征集合;C3、生成线程类并发特征集合;
D、遍历控制流图,生成当前待测软件源程序元素的路径,收集可达路径中的线程的并发特征,生成线程锁特征集合;
E、遍历线程锁特征集合,生成程序占有请求特征集合和程序锁图,对程序占有请求特征集合和程序锁图进行分析,生成潜在死锁集合;
F、遍历线程锁特征集合,生成锁对象的门锁集合,分析潜在死锁集合中的死锁,分析不同的锁对象,删除存在相同门锁对象的情况;
G、遍历控制流图,对当前待测软件源程序进行并发和逃逸分析,删除潜在死锁集合中不能并发的死锁,得到最终死锁集合。
2.根据权利要求1所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所述步骤D进一步包括:
D1、遍历控制流图,计算程序的可达路径;具体为:对控制流的分析以函数为单位进行;函数过程间调用关系根据函数调用关系图,按照调用关系的拓扑逆序进行;
D2、对可达路径上的线程进行分析,收集线程的并发特征;具体为:对于直接声明的线程类对象,对步骤C中得到的线程类并发特征集合进行查询,创建线程并发特征,存入线程并发特征集;对新创建的线程,进行锁特征分析,生成线程并发特征,也存入线程并发特征集;
D3、生成线程并发特征集合。
3.根据权利要求2所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所述步骤E进一步包括:
E1、对步骤D2中生成的线程并发特征集进行占有请求特征分析,生成占有请求特征集合;具体为:对每个线程并发特征进行分析,生成占有请求特征对,存入占有请求特征集合;
E2、对步骤D2中生成的线程并发特征集进行分析,生成程序锁图;
E3、对步骤E1中生成的占有请求特征集进行分析,找到潜在的死锁对,存入潜在的死锁对集合,生成潜在死锁对集合;
E4、对步骤E1中生成的锁图进行分析,找到存在的环路作为潜在死锁环,存入潜在的死锁环集合,生成潜在死锁环集合。
4.根据权利要求3所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所述步骤E2进一步包括:
E21、创建程序锁图,将线程并发特征集中的每个线程并发特征的特征森林中的结点和边添加到锁图中;
E22、通过步骤B中的指向分析图对锁图中不同线程的结点进行别名分析,在互为别名的结点间加边。
5.根据权利要求3所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所述步骤E3进一步包括:
E31、通过步骤B中的指向分析图对不同线程中的变量进行别名分析;
E32、对步骤E1中生成的占有请求特征集中的占有请求特征进行笛卡尔积分析,对不同线程的占有请求特征进行分析,如果线程1的占有的锁与线程2请求的锁互为别名,同时线程1请求的锁与线程2请求的锁互为别名,则作为潜在死锁对,存入潜在死锁对集合。
6.根据权利要求1所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所述步骤F进一步包括:
F1、对每一个线程并发特征进行分析,分析每个锁获得前需要获得锁,即门锁,生成锁对象的门锁集合;所述门锁,对于一个锁对象,在获得该锁之前需要获得的锁为这个锁对象的门锁;
F2、对步骤E中生成的潜在死锁集合中的死锁对和死锁环进行分析,分析每一个死锁对或者死锁环,如果一个死锁中,不同线程的两个锁对象具有相同的门锁对象,则不能构成死锁,从潜在死锁集合中删除;
F3、更新潜在死锁集合。
7.根据权利要求1所述的基于代码静态分析的多线程死锁检测方法,其特征在于,所述步骤G进一步包括:
G1、遍历控制流图,对生成的线程并发特征集合进行分析,分析线程是否可以并发;
G2、对步骤F中更新后的潜在死锁集合进行分析,分析每一个死锁中的线程是否能够并发,如果不能,则删除死锁,更新潜在死锁集合;
G3、对步骤G2中更新后的潜在死锁集合中的死锁进行分析,分析每一个死锁中涉及的锁对象是否为抢占的或者是否可以被多个线程并发调用;如果为抢占的,则删除该死锁,更新潜在死锁集合;如果只能为一个线程调用,则删除该死锁,更新潜在死锁集合;
G4、生成最终死锁集合。
8.一种基于代码静态分析的多线程死锁检测系统,其特征在于,该系统主要包括分析模块、别名分析模块、线程并发特征分析模块、可达分析模块和门锁分析模块以及并发与逃逸分析模块,其中,
分析模块,用于读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成抽象语法树和控制流图;
别名分析模块,用于通过遍历分析模块生成的抽象语法树,对程序进行指向分析,生成指向分析图,对变量进行别名分析;
线程并发特征分析模块,用于通过遍历分析模块生成的抽象语法树,对程序中的线程类进行线程并发特征分析,生成线程类并发特征集合;
可达分析模块,用于对锁生成的控制流图进行遍历,对可达路径上的线程进行并发特征分析,生成线程并发特征集;对线程并发特征集生成的占有请求特征集和程序锁图进行分析,生成潜在死锁对集合和死锁环集合,所述潜在死锁对集合和死锁环集合统称潜在死锁集合;
门锁分析模块,用于对潜在死锁集合中的锁对象进行门锁分析,删除不同线程锁对象存在共同门锁的死锁,更新潜在死锁集合;以及
并发与逃逸分析模块,用于对线程并发特征集合中的线程进行并行分析,分析线程是否可以并行执行;对潜在死锁集合中的死锁的锁进行分析,判断该锁是否是可抢占的或者该锁只能被单独线程调用;还用于删除潜在死锁集合中存在线程不可并发的死锁,或者锁对象可抢占,或者锁对象只能被单独线程调用的死锁。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010106225706A CN102073588B (zh) | 2010-12-28 | 2010-12-28 | 一种基于代码静态分析的多线程死锁检测方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010106225706A CN102073588B (zh) | 2010-12-28 | 2010-12-28 | 一种基于代码静态分析的多线程死锁检测方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102073588A CN102073588A (zh) | 2011-05-25 |
CN102073588B true CN102073588B (zh) | 2013-11-20 |
Family
ID=44032134
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2010106225706A Expired - Fee Related CN102073588B (zh) | 2010-12-28 | 2010-12-28 | 一种基于代码静态分析的多线程死锁检测方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102073588B (zh) |
Families Citing this family (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103927473A (zh) * | 2013-01-16 | 2014-07-16 | 广东电网公司信息中心 | 检测移动智能终端的源代码安全的方法、装置及系统 |
CN103942137B (zh) * | 2013-01-23 | 2017-08-25 | 腾讯科技(深圳)有限公司 | 浏览器兼容性测试方法及装置 |
CN104252346B (zh) * | 2013-06-27 | 2017-08-29 | 华为技术有限公司 | 一种并发分析的方法及装置 |
CN105426978B (zh) * | 2014-09-04 | 2021-05-04 | 中兴通讯股份有限公司 | 一种业务并发性预测方法与预测系统 |
CN105468508B (zh) * | 2014-09-04 | 2018-07-03 | 阿里巴巴集团控股有限公司 | 代码检测方法及装置 |
CN105607912B (zh) * | 2015-12-24 | 2019-07-09 | 华为技术服务有限公司 | 一种Java对象分配优化方法、装置及设备 |
CN105786703B9 (zh) * | 2016-02-01 | 2018-04-13 | 中国科学院软件研究所 | 一种基于锁提前获取的死锁自动修复方法 |
CN107391265B (zh) * | 2016-03-25 | 2020-12-04 | 阿里巴巴集团控股有限公司 | 用于进程中检测死锁的方法和设备 |
CN107291558B (zh) * | 2016-03-30 | 2020-11-24 | 阿里巴巴集团控股有限公司 | 一种应用程序接口死锁监控方法和装置 |
CN106201874B (zh) * | 2016-07-06 | 2018-12-28 | 华为技术有限公司 | 并行程序的mhp分析方法和装置 |
CN106294156B (zh) * | 2016-08-11 | 2018-12-07 | 北京邮电大学 | 一种静态代码缺陷检测分析方法及装置 |
CN107885488B (zh) | 2016-09-29 | 2021-06-01 | 微软技术许可有限责任公司 | 意图和具有意图的锁 |
CN106407016B (zh) * | 2016-10-19 | 2021-06-25 | 腾讯科技(深圳)有限公司 | 一种多线程争抢资源的模拟方法及装置 |
CN109213576B (zh) * | 2017-07-01 | 2022-04-08 | 武汉斗鱼网络科技有限公司 | 程序死锁检测方法、存储介质、设备及系统 |
CN107391381A (zh) * | 2017-07-31 | 2017-11-24 | 东南大学 | 一种基于锁对象拆分策略的并发程序测试方法及其测试系统 |
US11288105B2 (en) | 2020-07-27 | 2022-03-29 | International Business Machines Corporation | Preventing deadlocks in runtime |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
-
2010
- 2010-12-28 CN CN2010106225706A patent/CN102073588B/zh not_active Expired - Fee Related
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
Non-Patent Citations (4)
Title |
---|
基于抽象语法树的代码静态自动测试方法研究;宫云战等;《北京化工大学学报(自然科学版)》;20071231;第34卷;25-29 * |
基于静态源码分析的多线程死锁检测方法研究;白哥乐;《北京邮电大学硕士学位论文》;20110809;1-62 * |
宫云战等.基于抽象语法树的代码静态自动测试方法研究.《北京化工大学学报(自然科学版)》.2007,第34卷25-29. |
白哥乐.基于静态源码分析的多线程死锁检测方法研究.《北京邮电大学硕士学位论文》.2011,1-62. |
Also Published As
Publication number | Publication date |
---|---|
CN102073588A (zh) | 2011-05-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102073588B (zh) | 一种基于代码静态分析的多线程死锁检测方法及系统 | |
CN102073589B (zh) | 一种基于代码静态分析的数据竞争检测方法及系统 | |
Heuzeroth et al. | Automatic design pattern detection | |
US7810079B2 (en) | System and method for determining execution path difference in program | |
Rachatasumrit et al. | An empirical investigation into the impact of refactoring on regression testing | |
Law et al. | Whole program path-based dynamic impact analysis | |
KR101410099B1 (ko) | 단위 테스트 케이스 재사용 기반의 함수 테스트 장치 및 그 함수 테스트 방법 | |
CN106649100A (zh) | 一种自动化测试方法及系统 | |
Von Praun et al. | Static Detection of Atomicity Violations in Object-Oriented Programs. | |
Nayak et al. | Automatic Test Data Synthesis using UML Sequence Diagrams. | |
Zhu | JFuzz: A tool for automated Java unit testing based on data mutation and metamorphic testing methods | |
Washizaki et al. | A technique for automatic component extraction from object-oriented programs by refactoring | |
CN102110051A (zh) | 应用程序切片技术的静态缺陷检测方法 | |
CN101937396B (zh) | 软件程序中变量的不安全使用的检测方法 | |
Long et al. | Data flow analysis of concurrent systems that use the rendezvous model of synchronization | |
Lochau et al. | Feature interaction aware test case generation for embedded control systems | |
CN105159827A (zh) | 一种面向gui软件的可靠性加速测试方法 | |
Vanciu et al. | Hidden dependencies in software systems | |
US8607204B2 (en) | Method of analyzing single thread access of variable in multi-threaded program | |
Kahlon et al. | Semantic reduction of thread interleavings in concurrent programs | |
Liuying et al. | Test selection from UML statecharts | |
Sun et al. | Propagating bug fixes with fast subgraph matching | |
Long et al. | Mutation-based exploration of a method for verifying concurrent Java components | |
Cheng | The self-measurement principle: A design principle for large-scale, long-lived, and highly reliable concurrent systems | |
Vert et al. | Detection of incorrect pointer dereferences for C/C++ programs using static code analysis and logical inference |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20131120 Termination date: 20171228 |