CN102073589A - 一种基于代码静态分析的数据竞争检测方法及系统 - Google Patents

一种基于代码静态分析的数据竞争检测方法及系统 Download PDF

Info

Publication number
CN102073589A
CN102073589A CN2010106227307A CN201010622730A CN102073589A CN 102073589 A CN102073589 A CN 102073589A CN 2010106227307 A CN2010106227307 A CN 2010106227307A CN 201010622730 A CN201010622730 A CN 201010622730A CN 102073589 A CN102073589 A CN 102073589A
Authority
CN
China
Prior art keywords
function
node
statement
thread
another name
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.)
Granted
Application number
CN2010106227307A
Other languages
English (en)
Other versions
CN102073589B (zh
Inventor
黄俊飞
宫云战
杨朝红
金大海
姚欣洪
王雅文
肖庆
白哥乐
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing University of Posts and Telecommunications
Original Assignee
Beijing University of Posts and Telecommunications
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing University of Posts and Telecommunications filed Critical Beijing University of Posts and Telecommunications
Priority to CN 201010622730 priority Critical patent/CN102073589B/zh
Publication of CN102073589A publication Critical patent/CN102073589A/zh
Application granted granted Critical
Publication of CN102073589B publication Critical patent/CN102073589B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种基于代码静态分析的数据竞争检测方法及系统,该方法包括:读取待测软件,对待测软件源程序进行静态分析,生成待测软件的抽象语法树、控制流图、全局函数调用图;在此基础之上计算每个函数内部的别名信息、函数间出口别名信息、锁集合信息、函数内部访问可逃逸变量的访问链以及线程创建关系图;根据访问链计算每两个线程之间访问节点的初始化语句对集合;根据别名信息、锁集合信息、并发关系对该集合进行逐步删减得到最终可能发生数据竞争的语句对。本发明提供的检测方法与检测系统能对C/C++编写的多线程程序进行有效的数据竞争检测,具有测试精度高和自动化程度高的特点,适用于对两个线程或多个线程导致的数据竞争的检测。

Description

一种基于代码静态分析的数据竞争检测方法及系统
技术领域
本发明有关一种软件测试技术,特别是指一种基于代码静态分析的数据竞争检测方法及系统。
背景技术
软件开发后在投入运行前需对其进行测试,对软件需求分析、设计规格说明和编码实现的最终审查,是软件质量保证的关键步骤。软件测试是为了发现错误而执行程序的过程,在一个可控的软件测试环境中分析或执行程序,其根本目的是以尽可能少的时间和人力发现并改正软件中潜在的各种故障及缺陷,提高软件的质量。
从测试过程是否需要运行被测软件的角度,可将软件测试方法分为两大类:动态测试法和静态测试法。所谓动态测试,就是通过运行软件来检验软件的动态行为和运行结果的正确性。而静态测试的基本特征是在对软件进行分析、检查和测试时并不实际运行被测试的程序。动态测试和静态测试各有其优缺点:动态测试的优点是发现的软件错误非常直观,缺点是对测试用例的设计要求高,不同的测试用例集合发现错误的能力差别很大,另外,由于动态测试法需要实际运行被测程序也是一个限制。而动态测试的缺点恰恰是静态测试优点,静态测试不需要实际运行被测程序,不需要设计相关的测试用例,容易自动化,静态测试的缺点是:发现的问题往往不能完全自动确定为真正的错误,需要人工确认,所以静态测试又被称作静态分析。
从可计算性理论的角度来看,静态分析是一个不可判定问题,提高精度是静态测试的核心问题,提高精度通常包括两个方面:减少误报(False Positive)和减少漏报(False Negative)。由于大量的误报会使人误以为被测软件存在很多问题,对测试失去信心,而漏报则会造成程序具有较高质量的假象。静态测试过程中,造成静态分析不精确的本质在于缺少程序动态执行信息,因此,怎样更好地近似表示和计算程序动态执行信息是提高精度的关键。
在现代软件的开发中,并发程序以其资源利用率高、计算速度快等优点在实际应用中得到了广泛应用。由于并发行为的复杂性及不确定性,使得其开发、测试与维护比一般软件的开发更困难。其中,并发程序最基本的缺陷是数据竞争,在共享内存的多线程程序中,如果一对线程同时访问了同一块内存,有一个访问是写操作,并且这一对线程没有通过加锁进行互斥操作,那么这个程序则可能发生数据竞争。多线程的程序一旦发生数据竞争,将很难被发现。它仅仅是违反了数据结构的不变量,而不会立即引起程序的崩溃,它只有在长期的运行程序的过程中会发生一些错误,因此很难追溯到数据竞争的根源。
发明内容
有鉴于此,本发明的主要目的在于提供一种能对C/C++编写的多线程程序进行有效的数据竞争检测的基于代码静态分析的数据竞争检测方法及系统。
为达到上述目的,本发明提供一种基于代码静态分析的数据竞争检测方法,该方法包括以下步骤:
A、读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成待测软件的抽象语法树、控制流图、全局函数调用图;
B、遍历每个源文件生成的抽象语法树,找出所有线程的入口函数;
C、遍历每个函数的控制流图,计算每个函数内部的别名信息、函数间出口别名信息、锁集合信息、函数内部访问可逃逸变量的访问链以及线程创建关系图;
D、遇到每个线程的入口函数时,计算当前线程的函数调用链以及修改线程创建关系图;
E、计算每两个线程之间访问节点的初始化语句对集合;
F、遍历初始化语句对集合,根据别名信息删除其中不存在别名关系的语句对,得到拥有别名信息的语句对集合;
G、遍历拥有别名信息的语句对集合,根据锁集合信息,删除其中拥有别名锁的语句对,从而得到缺乏锁同步的语句对集合;
H、遍历缺乏锁同步的语句对集合,根据线程创建关系图删除不可能并发执行的语句对,从而得到最终可能发生数据竞争的语句对。
更进一步地,步骤A中,在计算出全局函数调用图后,会执行如下步骤:
A1、对函数调用图进行拓扑逆序,得到所有函数的拓扑逆序链。
A2、根据函数的拓扑逆序链得到程序源文件的近似依赖关系,然后执行步骤B。
更进一步地,所述步骤C,主要是迭代每个函数的控制流图节点,根据数据流方程计算节点的入口、出口信息,具体包括:
C1、针对每个控制流图节点,根据其所有前驱节点的别名信息计算该节点的入口别名信息;
C2、针对每个控制流图节点,根据其所有前驱节点的锁集合信息计算该节点的入口锁集合信息;
C3、根据节点的性质,计算当前节点的出口别名信息、锁集合信息、创建可逃逸变量的访问节点或者计算函数间的出口别名信息。
其中,步骤C3进一步包括:
C3.1、如果当前节点是普通变量的声明初始化语句,则根据所赋值的变量的性质,判断是否需要创建可逃逸访问节点;
C3.2、如果当前节点是指针变量的声明初始化语句,则根据所赋值的变量的性质,计算别名信息;
C3.3、如果当前节点是普通变量的赋值语句,则根据等式左右两边的变量的性质,判断是否需要创建可逃逸访问节点;
C3.4、如果当前节点是指针变量的赋值语句,则根据等式左右两边的变量性质,计算别名关系;
C3.5、如果当前节点是动态内存分配函数,则把所分配的变量记录到可逃逸集合中;
C3.6、如果当前节点是锁操作函数(Lock,Unlock),则计算锁集合信息;
C3.7、如果当前节点是创建新线程的函数,则计算线程创建关系图。
上述步骤D,进一步包括:
D1、根据步骤B得到的线程入口函数信息,判断当前函数是否是线程入口函数,如果是执行步骤D2;
D2、从步骤A中所计算得到的全局函数调用图,采用深度优先搜索的方式得到当前函数为入口函数的函数调用链,表示一个可能执行线程。
上述步骤E,进一步包括:
E1、获取每两个线程中每个函数的可逃逸节点访问链;
E2、依次遍历每两个访问节点,如果两个访问节点至少有一个是写操作,则执行步骤E3,否则继续执行E2,直到所有节点都遍历完毕;
E3、记录该节点对,增加到初始化语句对集合中。
其中,所述抽象语法树包括表示类型信息的对象和符号表。
所述控制流图为具有单一、固定入口节点和出口节点的有向图。
所述全局函数调用图为具有多个入口节点的有向图。
所述线程创建关系图为具有单一入口的单向图。
所述可逃逸访问节点包括全局变量访问节点和动态分配变量访问节点。
所述语句对是一个二元组,是由两个访问节点构成的多对多的映射关系。
本发明同时提供了一种基于代码静态分析的数据竞争检测系统,该系统包括:
分析模块,读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成抽象语法树、控制流图以及全局函数调用图;
线程摘要计算模块,通过迭代每个函数的控制流图,计算变量别名、锁集合以及每个函数的可逃逸节点访问链;遇到线程入口函数,计算线程的函数调用链,作为表示每个线程的摘要;
线程创建关系图计算模块,通过分析创建线程函数的关系,计算线程之间的创建关系图;
数据竞争计算模块,通过线程摘要进行计算分析,最终得出可能发生数据竞争的节点访问。
上述技术方案中,所述线程摘要计算模块进一步包括:
别名分析单元,通过迭代每个函数的控制流图,计算出相关的变量别名信息集合,识别可能指向同一个内存地址的变量;
锁集合分析单元,通过迭代每个函数的控制流图,分析每个函数调用点,根据函数的特征计算锁集合信息;
可逃逸节点访问链构造单元,迭代每个函数的控制流图,对于操作变量的节点,如果该变量可逃逸,则建立可逃逸节点并保存到某个数据集合中,如果该变量不可逃逸,则忽略。
上述技术方案中,所述数据竞争计算模块进一步包括:
初始化语句对集合计算单元,通过提取线程函数摘要,遍历每两个线程的函数节点访问链,对其中存在写写、读写、写读操作的节点建立一个映射关系,作为语句对;
拥有别名的语句对集合计算单元,遍历初始化语句对集合,通过分析每个节点的别名关系,删除不存在别名关系的语句对;
缺乏锁同步的语句对集合计算单元,遍历拥有别名的语句对集合,通过分析每个节点的锁集合信息,删除拥有别名锁的语句对;
并发执行计算单元,遍历缺乏锁同步的语句对集合,根据线程创建关系图判断语句对是否存在可能并发的情况,如果不存在,则删除,否则保留;最终得到可能发生数据竞争的语句对。
本发明的基于代码静态分析的数据竞争检测方法及系统,由于采用线程摘要的方式,记录线程所访问可逃逸访问节点,并遍历每两个线程的访问节点,在此基础上计算出一个最大范围的可能数据竞争的语句对,然后根据别名、锁集合、可能并发的分析一步步排除不可能发生数据竞争的语句对,因此,该方法具有高的可靠性。
附图说明
图1为本发明基于代码静态分析的数据竞争检测方法的实现流程示意图;
图2为本发明中计算初始化语句的流程示意图;
图3为本发明中的线程创建关系图。
具体实施方式
为便于对本发明中的方法与系统及达到的效果有进一步的了解,现配合附图并举较佳实施例详细说明如下。
本发明提供了一种基于代码静态分析的数据竞争检测方法,其基本思想是:读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成待测软件的抽象语法树、控制流图、全局函数调用图(CG);遍历每个源文件生成的抽象语法树,找出所有线程的入口函数;遍历每个函数的控制流图,计算每个函数内部的别名信息、函数间出口别名信息、锁集合信息、函数内部访问可逃逸变量的访问链以及线程创建关系图;在遍历函数的过程中,如果遇到每个线程的入口函数时,计算当前线程的调用链以及修改线程创建关系图;计算每两个线程之间访问节点的初始化语句对集合;遍历初始化语句对集合,根据别名信息删除其中不存在别名关系的语句对,得到拥有别名信息的语句对集合;遍历拥有别名信息的语句对集合,根据锁集合信息,删除其中拥有别名锁的语句对,从而得到缺乏锁同步的语句对集合;最后,遍历缺乏锁同步的语句对集合,根据线程创建关系图删除不可能并发执行的语句对,从而得到最终可能发生数据竞争的语句对。
图1为本发明基于代码静态分析的数据竞争检测方法的实现流程示意图,如图1所示,该方法包括以下步骤:
步骤1、读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成待测软件的抽象语法树、控制流图、全局函数调用图;
步骤2、遍历每个源文件生成的抽象语法树,找出所有线程的入口函数;
步骤3、遍历每个函数的控制流图,计算每个函数内部的别名信息、函数间出口别名信息、锁集合信息、函数内部访问可逃逸变量的访问链以及线程创建关系图;
步骤4、遇到每个线程的入口函数时,计算当前线程的调用链以及修改线程创建关系图;
步骤5、计算每两个线程之间访问节点的初始化语句对集合;
步骤6、遍历初始化语句对集合,根据别名信息删除其中不存在别名关系的语句对,得到拥有别名信息的语句对集合;
步骤7、遍历拥有别名信息的语句对集合,根据锁集合信息,删除其中拥有别名锁的语句对,从而得到缺乏锁同步的语句对集合;
步骤8、遍历缺乏锁同步的语句对集合,根据线程创建关系图删除不可能并发执行的语句对,从而得到最终可能发生数据竞争的语句对。
其中步骤1具体包括:
步骤1.1、读取待测软件源程序,对待测软件源程序进行词法分析;
对待测软件进行词法分析(Lexical Analysis),该词法分析为后续形成语法树提供所需要的符号节点,如常量和名字。
步骤1.2、在步骤1.1的基础上,对待测软件源程序进行语法分析及语义分析,生成抽象语法树;
对待测软件进行语法分析(Parsing),所述语法分析提供了含有代表相应语法结构的中间节点的语法树,该语法树包括表示非保留字终结符的叶子节点和表示语法结构的中间节点;语义分析(Semantic Analysis)对名字和作用域进一步进行处理,生成抽象语法树,该抽象语法树包括表示类型信息的对象和符号表,并将它们连接成树形结构,这是编译器前端的最根本的输出,抽象语法树包含所有的从源代码所得到的相关信息,并且能够完全体现源程序的语法结构。
上述抽象语法树具有一致的结构模式,由不同类型的节点组成,每一类节点都被描述成一个类结构。所有的语法树节点都支持一个统一的访问者模式接口,这样就能很方便地对抽象语法树通过访问者模式进行进一步的不同形式的加工、遍历访问和输出。
步骤1.3、在所生成抽象语法树的基础上生成控制流图和全局函数调用图;
这个过程是一个遍历抽象语法树的过程。通常,一个程序控制流图可表示为(N,E,Entry,Exit)。其中,N代表节点的集合,反映程序中的语句和条件判断;E代表有向边的集合,反映程序中语句间的控制流关系;Entry为程序固定的唯一入口节点;Exit为程序唯一的退出节点。简单地说,控制流图就是具有单一、固定入口节点和出口节点的有向图;
全局函数调用图记录了整个程序所有函数之间的调用关系,它在需要符号表的信息做支持,可以是一个一个入口、多个出口的有向图,也可以是有多个入口,多个出口的有向图。
步骤2具体包括:
步骤2.1,遍历抽象语法树,找到当前源文件所有的函数调用节点;
这个过程,可以根据函数调用的特征,在抽象语法数中匹配出所有函数调用节点。
步骤2.2,在步骤2.1的基础上,遍历所获取的函数调用节点,判断当前的函数调用点是否为创建线程的函数,如果是,则记录下该线程的入口函数;
这个过程首先需要识别创建线程的函数,然后根据创建线程函数的特征,由于每个创建线程的函数都会有一个参数指定新线程的入口函数,便可以记录下这个函数。这为之后计算线程调用链,以及线程创建关系图奠定了基础。
步骤3具体包括:
步骤3.1,计算变量的别名信息;
本文所采用的是可能别名分析技术,使用数据流方式迭代每个函数的控制流图节点,数据流方程如下所示:
in [ n ] = ∪ p ∈ pred [ n ] out [ p ]
out[n]=gen[n]∪in[n]
对于控制流图上的每个节点,会首先得到该节点所有前驱节点,把所有前驱节点的别名集合做并运算得到的结果则为当前节点的入口别名信息集合;
由于采用可能别名分析技术,计算当前节点的出口别名时,不会删除以前所拥有的别名信息,而只会简单的增加,因此,该数据流方程并不是传统的数据流方程。
例如,下列程序
Figure BSA00000411671800091
经过别名计算后,所得到的别名关系为:{<p->{global1,global2}>}
步骤3.2,计算锁集合信息;
锁集合的分析也采用数据流方程的方式,迭代每个函数的控制流图节点,计算锁集合的数据流方程如下:
in [ n ] = &cup; p &Element; pred [ n ] out [ p ]
out[n]=gen[n]∪(in[n]-kill[n])
该数据流方程与传统的数据流方程一致,对于每个节点,它的前驱所有节点的出口锁集合的并运算的结果即为该节点的入口锁集合;而出口处的锁集合会与该节点的具体操作而有所不同,如果该节点为申请锁的函数,如lock,并且上的锁不是本地对象,则把当前的锁对象加入到锁集合中;如果该节点为释放锁的函数,如unlock,则把该锁对象从锁集合中删除。
例如,下列程序中,程序代码的右侧显示了上述函数fun中的锁集合信息的计算过程:
Figure BSA00000411671800093
Figure BSA00000411671800101
步骤3.3,创建可逃逸变量访问节点;
这个过程也是迭代函数控制流图节点的过程,主要记录当前函数访问的所有非本地变量,访问节点为一个四元组<variable,accessmode,aliasset,lockset>,分别表示,当前的变量、访问的方式、变量的别名信息以及访问变量时所申请的锁对象。
例如,下列程序
Figure BSA00000411671800102
上述程序的可逃逸访问节点为:<p,WRITE,{global},{lock}>。
步骤3.4,计算线程创建关系图;
在迭代函数控制流图节点的过程中,对于创建新的线程的节点,则计算线程创建的关系图,记录下一个三元组<createdthread,func,entryfunc>,分别表示,创建新线程的线程(使用入口函数表示)、当前创建了新线程的函数以及被创建线程的入口函数。
步骤4具体包括:
步骤4.1,判断当前分析函数是否为线程入口函数;
该过程只需要遍历步骤2中所获取的所有线程入口函数,判断当前的函数是否在这些函数中;得到线程入口函数是为了能够获得整个线程的函数调用链,对之后的数据竞争判断奠定基础;
步骤4.2,如果当前函数是线程入口函数,则采用深度优先遍历步骤1所获得的全局函数调用图,得到该函数为入口的线程的函数调用链;同时修改线程创建关系图;
采用深度优先遍历的方法能够更好的得到线程的函数调用路径,对于出现直接递归或者间接递归调用的函数,也只会在调用链上出现一次。
修改线程的创建关系图即修改步骤3.4所提到的三元组<createdthread,func,entryfunc>,对于存在创建线程的函数节点,会使用当前它所在线程的入口函数来修改这个三元组。
如图2所示,步骤5具体包括:
步骤5.1,得到线程1的函数调用链;
步骤5.2,得到线程2的函数调用链;
步骤5.3,线程1是否还有函数节点未访问;如果是执行步骤5.4,否则结束;
步骤5.4,取得线程1中每个函数的节点访问链;
步骤5.5,遍历线程2中的每一个函数节点;
步骤5.6,线程2中是否还有函数节点未被访问,是继续执行步骤5.7;否则执行步骤5.3;
步骤5.7,取得线程2中每个函数的节点访问链;
步骤5.8,线程1的节点访问链中是否还有节点未被访问,是则继续执行步骤5.9;否则执行步骤5.3;
步骤5.9,获取线程1的访问节点;
步骤5.10,遍历线程2当前函数节点的所有访问节点;
步骤5.11,线程2的节点访问链是否还有节点未被访问,是则执行步骤5.6;否则执行步骤5.12;
步骤5.12,获取线程2的访问节点;
步骤5.13,两个节点是否至少有一个为写操作,是则执行步骤5.14;否则执行步骤5.11;
步骤5.14,保存这两个访问节点至初始化语句对集合中。
语句对是一个二元组<accessnode,accessnode>,每个accessnode就是步骤3.3所提到的四元组。创建这个语句对的前提是,至少有一个访问节点为写操作,即一个accessnode的accessmode属性为WRITE。
步骤6,具体包括:
步骤6.1,遍历初始化语句对集合,获取每个语句对;
步骤6.2,根据这个语句对两个访问节点的{aliasset}属性,如果两个节点的{aliasset}属性存在相同的元素,则这两个语句对存在别名关系,保留着;否则,从初始化集合中删除。
步骤7,具体包括:
步骤7.1,遍历步骤6执行结束所得的拥有别名的语句对集合,获得其中的每个语句对;
步骤7.2,根据每个语句对两个访问节点的{lockset}属性,如果两个节点的{lockset}属性拥有相同的元素,则这两个访问申请了相同的锁同步,便删除该语句对;否则,保留。
步骤8,具体包括:
步骤8.1,遍历缺乏锁同步的语句对集合,获得其中每一个语句对;
步骤8.2,得到步骤4.2中得到的线程创建关系图,根据其创建关系判断这两个访问语句是否可能并发执行,如果不行,就删除。
例如,图3所示的线程创建关系图,该图的线程创建关系图为{<t11,t13,t21>,<t21,t22,t31>},其中t11,t21,t31分别表示线程t1、t2、t3的入口地址。在这个创建关系图中,线程t1的函数节点1,2与其他线程不可能并发执行;线程t2的1函数节点与线程t3也不会并发执行。因此根据,这个线程创建关系图可以进一步删除不可能并发执行的语句对,提高了检测IP的精度。
本发明的为实现基于代码静态分析的数据竞争检测方法的系统包括:
分析模块,读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成抽象语法树、控制流图以及全局函数调用图;
线程摘要计算模块,通过迭代每个函数的控制流图,计算变量别名、锁集合以及每个函数的可逃逸节点访问链;遇到线程入口函数,计算线程的函数调用链,作为表示每个线程的摘要;
线程创建关系图计算模块,通过分析创建线程函数的关系,计算线程之间的创建关系图;
数据竞争计算模块,通过线程摘要进行计算分析,最终得出可能发生数据竞争的节点访问。
所述线程摘要计算模块进一步包括:
别名分析单元,通过迭代每个函数的控制流图,计算出相关的变量别名信息集合,识别可能指向同一个内存地址的变量;
锁集合分析单元,通过迭代每个函数的控制流图,分析每个函数调用点,根据函数的特征计算锁集合信息;
可逃逸节点访问链构造单元,迭代每个函数的控制流图,对于操作变量的节点,如果该变量可逃逸,则建立可逃逸节点并保存到某个数据集合中,如果该变量不可逃逸,则忽略。
所述数据竞争计算模块进一步包括:
初始化语句对集合计算单元,通过提取线程函数摘要,遍历每两个线程的函数节点访问链,对其中存在写写、读写、写读操作的节点建立一个映射关系,作为语句对;
拥有别名的语句对集合计算单元,遍历初始化语句对集合,通过分析每个节点的别名关系,删除不存在别名关系的语句对;
缺乏锁同步的语句对集合计算单元,遍历拥有别名的语句对集合,通过分析每个节点的锁集合信息,删除拥有别名锁的语句对;
并发执行计算单元,遍历缺乏锁同步的语句对集合,根据线程创建关系图判断语句对是否存在可能并发的情况,如果不存在,则删除,否则保留;最终得到可能发生数据竞争的语句对。
由上所述的结果可知,本发明的基于代码静态分析的数据竞争检测方法首先获得了全局所有线程的初始化语句对集合,然后根据别名、锁集合、并发关系等的分析,逐步深入分析,排除不可能出现数据竞争的语句对,提高了检测的精度,所以具备漏报少,可靠性高等特点。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。

Claims (9)

1.一种基于代码静态分析的数据竞争检测方法,其特征在于,该方法包括以下步骤:
A、读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成待测软件的抽象语法树、控制流图、全局函数调用图;
B、遍历每个源文件生成的所述抽象语法树,找出所有线程的入口函数;
C、遍历每个函数的所述控制流图,计算每个函数内部的别名信息、函数间出口别名信息、锁集合信息、函数内部访问可逃逸变量的访问链以及线程创建关系图;
D、遇到每个线程的入口函数时,计算当前线程的调用链以及修改所述线程创建关系图;
E、计算每两个线程之间访问节点的初始化语句对集合;
F、遍历初始化语句对集合,根据别名信息删除其中不存在别名关系的语句对,得到拥有别名信息的语句对集合;
G、遍历所述拥有别名信息的语句对集合,根据锁集合信息,删除其中拥有别名锁的语句对,从而得到缺乏锁同步的语句对集合;
H、遍历所述缺乏锁同步的语句对集合,根据所述线程创建关系图删除不可能并发执行的语句对,从而得到最终可能发生数据竞争的语句对。
2.根据权利要求1所述的基于代码静态分析的数据竞争检测方法,其特征在于,所述步骤C具体包括:
C1、针对每个控制流图节点,根据其所有前驱节点的别名信息计算该节点的入口别名信息;
C2、针对每个控制流图节点,根据其所有前驱节点的锁集合信息计算该节点的入口锁集合信息;
C3、根据节点的性质,计算当前节点出口的别名信息、锁集合信息、创建可逃逸变量的访问节点或者计算函数间的出口别名信息。
3.根据权利要求2所述的基于代码静态分析的数据竞争检测方法,其特征在于,所述步骤C3进一步包括:
C3.1、如果当前节点是普通变量的声明初始化语句,则根据所赋值的变量的性质,判断是否需要创建可逃逸访问节点;
C3.2、如果当前节点是指针变量的声明初始化语句,则根据所赋值的变量的性质,计算别名信息;
C3.3、如果当前节点是普通变量的赋值语句,则根据等式左右两边的变量的性质,判断是否需要创建可逃逸访问节点;
C3.4、如果当前节点是指针变量的赋值语句,则根据等式左右两边的变量性质,计算别名关系;
C3.5、如果当前节点是动态内存分配函数,则把所分配的变量记录到可逃逸集合中;
C3.6、如果当前节点是锁操作函数,则计算锁集合信息;
C3.7、如果当前节点是创建新线程的函数,则计算线程创建关系图。
4.根据权利要求1所述的基于代码静态分析的数据竞争检测方法,其特征在于,所述步骤D具体包括:
D1、根据所述步骤B得到的线程入口函数信息,判断当前函数是否是线程入口函数,如果是执行步骤D2;
D2、从所述步骤A中所计算得到的全局函数调用图,采用深度优先搜索的方式得到当前函数为入口函数的函数调用链,表示一个可能执行线程。
5.根据权利要求1述的基于代码静态分析的数据竞争检测方法,其特征在于,所述步骤E具体包括:
E1、获取每两个线程中每个函数的可逃逸节点访问链;
E2、依次遍历每两个访问节点,如果两个访问节点至少有一个是写操作,则执行步骤E3,否则继续执行步骤E2,直到所有节点都遍历完毕;
E3、记录该节点对,增加到初始化语句对集合中。
6.根据权利要求1所述的基于代码静态分析的数据竞争检测方法,其特征在于,所述抽象语法树包括表示类型信息的对象和符号表,所述控制流图为具有单一、固定入口节点和出口节点的有向图,所述全局函数调用图为具有多个入口节点的有向图,所述线程创建关系图为具有单一入口的有向图,所述可逃逸访问节点包括全局变量访问节点和动态分配变量访问节点,所述语句对是一个二元组,是由两个访问节点构成的多对多的映射关系。
7.一种基于代码静态分析的数据竞争检测系统,其特征在于,该系统包括:
分析模块,读取待测软件,对待测软件源程序进行词法分析、语法分析及语义分析,生成抽象语法树、控制流图以及全局函数调用图;
线程摘要计算模块,通过迭代每个函数的控制流图,计算变量别名、锁集合以及每个函数的可逃逸节点访问链;遇到线程入口函数,计算线程的函数调用链,作为表示每个线程的摘要;
线程创建关系图计算模块,通过分析创建线程函数的关系,计算线程之间的创建关系图;
数据竞争计算模块,通过线程摘要进行计算分析,最终得出可能发生数据竞争的节点访问。
8.根据权利要求7所述的基于代码静态分析的数据竞争检测系统,其特征在于,所述线程摘要计算模块进一步包括:
别名分析单元,通过迭代每个函数的控制流图,计算出相关的变量别名信息集合,识别可能指向同一个内存地址的变量;
锁集合分析单元,通过迭代每个函数的控制流图,分析每个函数调用点,根据函数的特征计算锁集合信息;
可逃逸节点访问链构造单元,迭代每个函数的控制流图,对于操作变量的节点,如果该变量可逃逸,则建立可逃逸节点并保存到数据集合中,如果该变量不可逃逸,则忽略。
9.根据权利要求7所述的基于代码静态分析的数据竞争检测系统,其特征在于,所述数据竞争计算模块进一步包括:
初始化语句对集合计算单元,通过提取线程函数摘要,遍历每两个线程的函数节点访问链,对其中存在写写、读写、写读操作的节点建立一个映射关系,作为语句对;
拥有别名的语句对集合计算单元,遍历初始化语句对集合,通过分析每个节点的别名关系,删除不存在别名关系的语句对;
缺乏锁同步的语句对集合计算单元,遍历拥有别名的语句对集合,通过分析每个节点的锁集合信息,删除拥有别名锁的语句对;
并发执行计算单元,遍历缺乏锁同步的语句对集合,根据线程创建关系图判断语句对是否存在可能并发的情况,如果不存在,则删除,否则保留;最终得到可能发生数据竞争的语句对。
CN 201010622730 2010-12-29 2010-12-29 一种基于代码静态分析的数据竞争检测方法及系统 Expired - Fee Related CN102073589B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN 201010622730 CN102073589B (zh) 2010-12-29 2010-12-29 一种基于代码静态分析的数据竞争检测方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN 201010622730 CN102073589B (zh) 2010-12-29 2010-12-29 一种基于代码静态分析的数据竞争检测方法及系统

Publications (2)

Publication Number Publication Date
CN102073589A true CN102073589A (zh) 2011-05-25
CN102073589B CN102073589B (zh) 2013-07-03

Family

ID=44032135

Family Applications (1)

Application Number Title Priority Date Filing Date
CN 201010622730 Expired - Fee Related CN102073589B (zh) 2010-12-29 2010-12-29 一种基于代码静态分析的数据竞争检测方法及系统

Country Status (1)

Country Link
CN (1) CN102073589B (zh)

Cited By (31)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102323906A (zh) * 2011-09-08 2012-01-18 哈尔滨工程大学 一种基于遗传算法的mc/dc测试数据自动生成方法
CN102981837A (zh) * 2012-11-06 2013-03-20 无锡江南计算技术研究所 指针别名关系判断方法和代码多版本优化方法
CN103365724A (zh) * 2012-04-02 2013-10-23 国际商业机器公司 用于检测可本地化的本机方法的方法和系统
CN103678136A (zh) * 2013-12-30 2014-03-26 北京控制工程研究所 一种基于控制流的数据竞争误报降低方法
CN103729244A (zh) * 2013-12-17 2014-04-16 华为技术有限公司 一种收集方法及装置
CN104252346A (zh) * 2013-06-27 2014-12-31 华为技术有限公司 一种并发分析的方法及装置
WO2015027403A1 (en) * 2013-08-28 2015-03-05 Hewlett-Packard Development Company, L.P. Testing multi-threaded applications
CN104679484A (zh) * 2013-11-27 2015-06-03 华为技术有限公司 一种并发分析方法及装置
CN105095092A (zh) * 2015-09-25 2015-11-25 南京大学 基于静态分析和动态运行的Web应用JavaScript代码原子性违反检测
CN106598845A (zh) * 2016-11-18 2017-04-26 华中科技大学 一种基于块偏序的动态数据竞争检测方法及系统
CN107168698A (zh) * 2017-04-24 2017-09-15 华南理工大学 图形化编程的自动编译方法
CN107967213A (zh) * 2017-12-07 2018-04-27 上海宇航系统工程研究所 一种航天软件临界资源访问冲突检测方法
CN108614707A (zh) * 2018-04-27 2018-10-02 深圳市腾讯网络信息技术有限公司 静态代码检查方法、装置、存储介质和计算机设备
CN108920370A (zh) * 2018-07-02 2018-11-30 北京百度网讯科技有限公司 兼容性问题检测方法、装置及设备
CN109165161A (zh) * 2018-08-30 2019-01-08 北京轩宇信息技术有限公司 一种针对c51语言程序中局部变量数据竞争的分析方法
CN109783353A (zh) * 2018-12-14 2019-05-21 平安普惠企业管理有限公司 一种程序分析方法及终端设备
CN109885489A (zh) * 2019-01-31 2019-06-14 清华大学 驱动程序中数据竞争检测方法及装置
CN110059014A (zh) * 2019-04-28 2019-07-26 西安邮电大学 一种并发程序数据竞争指令级定位方法
CN110149800A (zh) * 2015-04-07 2019-08-20 华为技术有限公司 一种用于处理与源程序的源代码相关联的抽象语法树的装置
CN110363004A (zh) * 2018-04-10 2019-10-22 腾讯科技(深圳)有限公司 一种代码漏洞检测方法、装置、介质及设备
CN111522730A (zh) * 2020-03-09 2020-08-11 平安科技(深圳)有限公司 程序测试方法及装置、计算机装置、计算机可读介质
CN111857811A (zh) * 2020-07-29 2020-10-30 湖南泛联新安信息科技有限公司 一种资源流图的构建方法
CN112000398A (zh) * 2020-08-17 2020-11-27 苏州达家迎信息技术有限公司 底层接口调用链路的确定方法、装置、计算机设备及介质
CN112800425A (zh) * 2021-02-03 2021-05-14 南京大学 一种基于图计算的代码分析的方法和装置
CN112817787A (zh) * 2021-01-28 2021-05-18 南京大学 中断驱动嵌入式系统数据竞争的自动检测方法
CN112965838A (zh) * 2021-03-16 2021-06-15 支付宝(杭州)信息技术有限公司 并发程序的数据竞争检查方法及装置
CN113590129A (zh) * 2021-07-17 2021-11-02 西北工业大学 一种基于同步反应式构件的代码自动生成方法
CN113742080A (zh) * 2020-09-10 2021-12-03 吕戈 一种高效的不可变对象执行环境的构建方法及装置
CN113867903A (zh) * 2021-12-06 2021-12-31 深圳前海微众银行股份有限公司 一种区块链中智能合约的并行冲突域确定方法及装置
CN114912110A (zh) * 2022-03-21 2022-08-16 中国科学院信息工程研究所 一种Node.js代码安全检测方法及系统
CN115794592A (zh) * 2023-02-10 2023-03-14 南京邮电大学 一种基于高阶函数的数据竞争检测方法

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101017458A (zh) * 2007-03-02 2007-08-15 北京邮电大学 基于源代码静态分析的软件安全代码分析器及其检测方法

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101017458A (zh) * 2007-03-02 2007-08-15 北京邮电大学 基于源代码静态分析的软件安全代码分析器及其检测方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
宫云战等: "基于抽象语法树的代码静态自动测试方法研究", 《北京化工大学学报(自然科学版)》, vol. 34, 31 December 2007 (2007-12-31), pages 25 - 29 *
杨朝红等: "一种路径敏感的静态缺陷检测方法", 《软件学报》, vol. 21, no. 2, 28 February 2010 (2010-02-28), pages 209 - 217 *

Cited By (56)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102323906B (zh) * 2011-09-08 2014-01-08 哈尔滨工程大学 一种基于遗传算法的mc/dc测试数据自动生成方法
CN102323906A (zh) * 2011-09-08 2012-01-18 哈尔滨工程大学 一种基于遗传算法的mc/dc测试数据自动生成方法
CN103365724B (zh) * 2012-04-02 2016-08-24 国际商业机器公司 用于检测可本地化的本机方法的方法和系统
CN103365724A (zh) * 2012-04-02 2013-10-23 国际商业机器公司 用于检测可本地化的本机方法的方法和系统
CN102981837A (zh) * 2012-11-06 2013-03-20 无锡江南计算技术研究所 指针别名关系判断方法和代码多版本优化方法
CN102981837B (zh) * 2012-11-06 2016-04-13 无锡江南计算技术研究所 指针别名关系判断方法和代码多版本优化方法
WO2014206216A1 (zh) * 2013-06-27 2014-12-31 华为技术有限公司 一种并发分析的方法及装置
CN104252346A (zh) * 2013-06-27 2014-12-31 华为技术有限公司 一种并发分析的方法及装置
CN104252346B (zh) * 2013-06-27 2017-08-29 华为技术有限公司 一种并发分析的方法及装置
WO2015027403A1 (en) * 2013-08-28 2015-03-05 Hewlett-Packard Development Company, L.P. Testing multi-threaded applications
US10725889B2 (en) 2013-08-28 2020-07-28 Micro Focus Llc Testing multi-threaded applications
CN104679484A (zh) * 2013-11-27 2015-06-03 华为技术有限公司 一种并发分析方法及装置
CN104679484B (zh) * 2013-11-27 2018-02-06 华为技术有限公司 一种并发分析方法及装置
CN103729244B (zh) * 2013-12-17 2017-04-26 华为技术有限公司 一种收集方法及装置
CN103729244A (zh) * 2013-12-17 2014-04-16 华为技术有限公司 一种收集方法及装置
CN103678136B (zh) * 2013-12-30 2015-07-08 北京控制工程研究所 一种基于控制流的数据竞争误报降低方法
CN103678136A (zh) * 2013-12-30 2014-03-26 北京控制工程研究所 一种基于控制流的数据竞争误报降低方法
CN110149800B (zh) * 2015-04-07 2021-12-14 华为技术有限公司 一种用于处理与源程序的源代码相关联的抽象语法树的装置
CN110149800A (zh) * 2015-04-07 2019-08-20 华为技术有限公司 一种用于处理与源程序的源代码相关联的抽象语法树的装置
CN105095092A (zh) * 2015-09-25 2015-11-25 南京大学 基于静态分析和动态运行的Web应用JavaScript代码原子性违反检测
CN106598845A (zh) * 2016-11-18 2017-04-26 华中科技大学 一种基于块偏序的动态数据竞争检测方法及系统
CN106598845B (zh) * 2016-11-18 2019-04-12 华中科技大学 一种基于块偏序的动态数据竞争检测方法及系统
CN107168698B (zh) * 2017-04-24 2020-11-24 华南理工大学 图形化编程的自动编译方法
CN107168698A (zh) * 2017-04-24 2017-09-15 华南理工大学 图形化编程的自动编译方法
CN107967213B (zh) * 2017-12-07 2021-06-04 上海宇航系统工程研究所 一种航天软件临界资源访问冲突检测方法
CN107967213A (zh) * 2017-12-07 2018-04-27 上海宇航系统工程研究所 一种航天软件临界资源访问冲突检测方法
CN110363004A (zh) * 2018-04-10 2019-10-22 腾讯科技(深圳)有限公司 一种代码漏洞检测方法、装置、介质及设备
CN110363004B (zh) * 2018-04-10 2023-01-03 腾讯科技(深圳)有限公司 一种代码漏洞检测方法、装置、介质及设备
CN108614707A (zh) * 2018-04-27 2018-10-02 深圳市腾讯网络信息技术有限公司 静态代码检查方法、装置、存储介质和计算机设备
CN108920370A (zh) * 2018-07-02 2018-11-30 北京百度网讯科技有限公司 兼容性问题检测方法、装置及设备
CN108920370B (zh) * 2018-07-02 2022-08-16 北京百度网讯科技有限公司 兼容性问题检测方法、装置及设备
CN109165161A (zh) * 2018-08-30 2019-01-08 北京轩宇信息技术有限公司 一种针对c51语言程序中局部变量数据竞争的分析方法
CN109783353A (zh) * 2018-12-14 2019-05-21 平安普惠企业管理有限公司 一种程序分析方法及终端设备
CN109885489A (zh) * 2019-01-31 2019-06-14 清华大学 驱动程序中数据竞争检测方法及装置
CN109885489B (zh) * 2019-01-31 2020-07-21 清华大学 驱动程序中数据竞争检测方法及装置
CN110059014A (zh) * 2019-04-28 2019-07-26 西安邮电大学 一种并发程序数据竞争指令级定位方法
CN110059014B (zh) * 2019-04-28 2022-09-27 西安邮电大学 一种并发程序数据竞争指令级定位方法
CN111522730B (zh) * 2020-03-09 2024-03-29 平安科技(深圳)有限公司 程序测试方法及装置、计算机装置、计算机可读介质
CN111522730A (zh) * 2020-03-09 2020-08-11 平安科技(深圳)有限公司 程序测试方法及装置、计算机装置、计算机可读介质
CN111857811A (zh) * 2020-07-29 2020-10-30 湖南泛联新安信息科技有限公司 一种资源流图的构建方法
CN111857811B (zh) * 2020-07-29 2023-09-22 湖南泛联新安信息科技有限公司 一种资源流图的构建方法
CN112000398B (zh) * 2020-08-17 2022-10-28 苏州达家迎信息技术有限公司 底层接口调用链路的确定方法、装置、计算机设备及介质
CN112000398A (zh) * 2020-08-17 2020-11-27 苏州达家迎信息技术有限公司 底层接口调用链路的确定方法、装置、计算机设备及介质
CN113742080A (zh) * 2020-09-10 2021-12-03 吕戈 一种高效的不可变对象执行环境的构建方法及装置
CN113742080B (zh) * 2020-09-10 2024-03-01 吕戈 一种高效的不可变对象执行环境的构建方法及装置
CN112817787A (zh) * 2021-01-28 2021-05-18 南京大学 中断驱动嵌入式系统数据竞争的自动检测方法
CN112817787B (zh) * 2021-01-28 2023-03-10 南京大学 中断驱动嵌入式系统数据竞争的自动检测方法
CN112800425A (zh) * 2021-02-03 2021-05-14 南京大学 一种基于图计算的代码分析的方法和装置
CN112965838A (zh) * 2021-03-16 2021-06-15 支付宝(杭州)信息技术有限公司 并发程序的数据竞争检查方法及装置
CN112965838B (zh) * 2021-03-16 2024-04-19 支付宝(杭州)信息技术有限公司 并发程序的数据竞争检查方法及装置
CN113590129B (zh) * 2021-07-17 2024-05-17 西北工业大学 一种基于同步反应式构件的代码自动生成方法
CN113590129A (zh) * 2021-07-17 2021-11-02 西北工业大学 一种基于同步反应式构件的代码自动生成方法
CN113867903A (zh) * 2021-12-06 2021-12-31 深圳前海微众银行股份有限公司 一种区块链中智能合约的并行冲突域确定方法及装置
CN113867903B (zh) * 2021-12-06 2022-04-01 深圳前海微众银行股份有限公司 一种区块链中智能合约的并行冲突域确定方法及装置
CN114912110A (zh) * 2022-03-21 2022-08-16 中国科学院信息工程研究所 一种Node.js代码安全检测方法及系统
CN115794592A (zh) * 2023-02-10 2023-03-14 南京邮电大学 一种基于高阶函数的数据竞争检测方法

Also Published As

Publication number Publication date
CN102073589B (zh) 2013-07-03

Similar Documents

Publication Publication Date Title
CN102073589B (zh) 一种基于代码静态分析的数据竞争检测方法及系统
CN102831057B (zh) 一种用功能图分析软件功能变更及其影响的方法
CN102567200A (zh) 基于函数调用图的并行化安全漏洞检测方法
CN102662825B (zh) 一种面向堆操作程序的内存泄漏检测方法
CN102073588A (zh) 一种基于代码静态分析的多线程死锁检测方法及系统
Haller et al. Mempick: High-level data structure detection in c/c++ binaries
Marron et al. Abstracting runtime heaps for program understanding
CN111736846B (zh) 一种面向动态分析的源代码插桩改进方法
Wei et al. State-sensitive points-to analysis for the dynamic behavior of JavaScript objects
Hu et al. A memory-related vulnerability detection approach based on vulnerability features
US8141082B2 (en) Node-based representation of multi-threaded computing environment tasks, and node-based data race evaluation
Haller et al. Scalable data structure detection and classification for C/C++ binaries
Nicolay et al. Detecting function purity in JavaScript
CN103678123A (zh) 一种适用于处理器系统单粒子软错误脆弱点识别方法
Wu Generating metamodel instances satisfying coverage criteria via SMT solving
CN114389978A (zh) 一种基于静态污点分析的网络协议侧信道检测方法和系统
Khurshid Generating structurally complex tests from declarative constraints
Cho et al. Practical lock/unlock pairing for concurrent programs
Fiedor et al. From shapes to amortized complexity
CN111611158A (zh) 一种应用性能分析系统及方法
Shao et al. Combining lexical and structural information for static bug localisation
CN114880673A (zh) 针对小程序源代码进行隐私数据泄露检测的方法及系统
Zhou et al. An interval-based model for detecting software defect using alias analysis
Ashish et al. Automated techniques and tools for program analysis: Survey
Chow et al. State space reduction in abstract interpretation of parallel programs

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: 20130703

Termination date: 20171229