CN112181808A - 一种程序并发缺陷检测方法、装置、设备以及存储介质 - Google Patents
一种程序并发缺陷检测方法、装置、设备以及存储介质 Download PDFInfo
- Publication number
- CN112181808A CN112181808A CN202010937282.3A CN202010937282A CN112181808A CN 112181808 A CN112181808 A CN 112181808A CN 202010937282 A CN202010937282 A CN 202010937282A CN 112181808 A CN112181808 A CN 112181808A
- Authority
- CN
- China
- Prior art keywords
- function
- code block
- determining
- detection data
- target
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本说明书一个或多个实施例提供一种程序并发缺陷检测方法、装置、设备以及存储介质。该方法包括:获取目标检测数据以及获取目标检测数据中的函数;根据目标检测数据以及函数之间的调用关系,得到函数调用序列链表;获取每个函数中的代码块;根据函数以及代码块之间的调用关系,得到代码块调用序列数组;根据目标检测数据、函数调用序列链表、代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出。本实现方式通过调用函数调用序列链表、代码块调用序列数组以及预设条件,对程序中源代码进行深层次的分析和检测,可以实现快速、准确地确定程序并发缺陷发生的类型以及位置,以便于及时处理缺陷,确保程序的健壮性和可靠性。
Description
技术领域
本说明书一个或多个实施例涉及计算机应用技术领域,尤其涉及一种程序并发缺陷检测方法、装置、设备以及存储介质。
背景技术
随着硬件性能的快速发展与大数据时代的来临,并发编程日益成为编程中不可忽略的重要组成部分。并发编程是非常广泛的概念,其向下依赖于操作系统、存储等,与分布式系统、微服务系统等,而又会具体落地于Java并发编程、Go并发编程、JavaScript异步编程等领域。云计算技术的出现是为了在所有维度上(内存、计算、存储等)实现无限的可扩展性,而并发编程技术及其相关理论也是构建大规模分布式应用的基础,也是建设我国未来信息产业的关键技术之一。
现有并发缺陷的研究多数集中在多线程系统,分布式系统,C/C++/Java等传统语言的大型应用程序和某些轻量的客户端JavaScript应用程序。Go语言作为“年轻”、“用途广”和“新特性”的并发编程语言,对Go语言并发缺陷的检测是程序分析和保证程序可靠性必不可少的内容。目前针对Go语言并发缺陷的检测效果不好。
发明内容
有鉴于此,本说明书一个或多个实施例的目的在于提出一种程序并发缺陷检测方法、装置、设备以及存储介质,以解决目前针对Go语言并发缺陷检测效果不好的问题。
基于上述目的,本说明书一个或多个实施例提供了一种程序并发缺陷检测方法,其特征在于,包括:获取目标检测数据以及获取目标检测数据中的函数;根据目标检测数据以及函数之间的调用关系,得到函数调用序列链表;获取每个函数中的代码块;根据函数以及代码块之间的调用关系,得到代码块调用序列数组;根据目标检测数据、函数调用序列链表、代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出。
进一步地,获取目标检测数据,包括:获取压缩源代码数据;解压压缩源代码数据,得到解压源代码数据;编译解压源代码数据,得到目标检测数据,并获取。
进一步地,根据目标检测数据以及函数之间的调用关系,得到函数调用序列链表,包括:确定目标检测数据中的目标函数;以目标函数为初始节点,将目标函数中第一个代码块中的第一个目标指令所指示的函数确定为第一节点,将目标函数中最后一个代码块中的最后一个目标指令所指示的函数确定为第N节点,N为正整数;根据目标函数中代码块之间的调用顺序以及每个代码块中目标指令的执行顺序,将第一节点至第N节点依次链接至初始节点,得到函数调用序列链表。
进一步地,每个代码块包括第一代码块标识和第二代码块标识;以及根据函数以及代码块之间的调用关系,得到代码块调用序列数组,包括:对于每个函数,将函数中的第一个代码块确定为第一元素;根据函数中已执行的第n-1个代码块以及第二代码块标识,确定函数中将要执行的第n个代码块,其中,第n个代码块中不包括第二代码标识,其中,n为大于等于2的正整数;将函数中的第n-1个代码块确定为第n-1元素;将函数中的第n个代码块确定为第n元素;根据第一元素至第n-1元素、第n元素以及代码块之间的调用关系,确定代码块调用序列子数组;组合每个函数对应的代码块调用序列子数组,得到代码块调用序列数组。
进一步地,根据目标检测数据、函数调用序列链表、代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出,包括:根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定目标检测数据中是否含有预设的保护函数;响应于确定目标检测数据中含有预设的保护函数,确定预设的保护函数所保护的目标变量;获取目标检测数据中所有的目标变量;对于每个目标变量,响应于确定该目标变量没有被预设的保护函数保护,确定存在并发缺陷,并将该目标变量的位置确定为并发缺陷的位置;输出第一预设值以及目标变量的位置。
进一步地,根据目标检测数据、函数调用序列链表、代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出,包括:对于每个函数,根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定被预设的保护函数所保护的目标变量的第一位置;确定每个函数中的程序结束指令所指示的第二位置;响应于确定在第一位置和第二位置之间不存在对目标变量进行释放保护操作,确定存在并发缺陷,并将第一位置确定为并发缺陷的位置;输出第二预设值以及第一位置;以及方法还包括:根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定被预设的保护函数所保护的目标变量的第三位置;对于同一目标变量,响应于确定存在被预设的保护函数所保护的该目标变量的第四位置,且第三位置到第四位置的操作路径是可达的,并且在第三位置和第四位置之间不存在对该目标变量进行释放保护操作,确定存在并发缺陷,并将第三位置和第四位置确定为并发缺陷的位置;输出第三预设值以及第三位置和第四位置。
进一步地,根据目标检测数据、函数调用序列链表、代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出,包括:根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定每个函数的调用序列之内,同一通道变量的关闭操作与读操作或者写操作之间是否存在可达的路径;响应于确定存在可达的路径,确定存在并发缺陷,并确定关闭操作的第五位置与读操作的第六位置或写操作的第七位置,并将第五位置与第六位置或第七位置确定为并发缺陷的位置;输出第四预设值以及第五位置与第六位置或第七位置。
一种程序并发缺陷检测装置,其特征在于,包括:
获取单元,被配置成获取目标检测数据以及获取目标检测数据中的函数;以及获取每个函数中的代码块;
函数调用序列链表确定单元,被配置成根据目标检测数据以及函数之间的调用关系,得到函数调用序列链表;
代码块调用序列数组确定单元,被配置成根据函数以及代码块之间的调用关系,得到代码块调用序列数组;
输出单元,被配置成根据目标检测数据、函数调用序列链表、代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出。
进一步地,获取单元进一步被配置成:获取压缩源代码数据;解压压缩源代码数据,得到解压源代码数据;编译解压源代码数据,得到目标检测数据,并获取。
进一步地,函数调用序列链表确定单元进一步被配置成:确定目标检测数据中的目标函数;以目标函数为初始节点,将目标函数中第一个代码块中的第一个目标指令所指示的函数确定为第一节点,将目标函数中最后一个代码块中的最后一个目标指令所指示的函数确定为第N节点,N为正整数;根据目标函数中代码块之间的调用顺序以及每个代码块中目标指令的执行顺序,将第一节点至第N节点依次链接至初始节点,得到函数调用序列链表。
进一步地,每个代码块包括第一代码块标识和第二代码块标识;以及代码块调用序列数组确定单元进一步被配置成:对于每个函数,将函数中的第一个代码块确定为第一元素;根据函数中已执行的第n-1个代码块以及第二代码块标识,确定函数中将要执行的第n个代码块,其中,第n个代码块中不包括第二代码标识,其中,n为大于等于2的正整数;将函数中的第n-1个代码块确定为第n-1元素;将函数中的第n个代码块确定为第n元素;根据第一元素至第n-1元素、第n元素以及代码块之间的调用关系,确定代码块调用序列子数组;组合每个函数对应的代码块调用序列子数组,得到代码块调用序列数组。
进一步地,输出单元进一步被配置成:根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定目标检测数据中是否含有预设的保护函数;响应于确定目标检测数据中含有预设的保护函数,确定预设的保护函数所保护的目标变量;获取目标检测数据中所有的目标变量;对于每个目标变量,响应于确定该目标变量没有被预设的保护函数保护,确定存在并发缺陷,并将该目标变量的位置确定为并发缺陷的位置;输出第一预设值以及没有被预设的保护函数保护的目标变量的位置。
进一步地,输出单元进一步被配置成:对于每个函数,根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定被预设的保护函数所保护的目标变量的第一位置;确定每个函数中的程序结束指令所指示的第二位置;响应于确定在第一位置和第二位置之间不存在对目标变量进行释放保护操作,确定存在并发缺陷,并将第一位置确定为并发缺陷的位置;输出第二预设值以及第一位置;该装置还包括:根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定被预设的保护函数所保护的目标变量的第三位置;对于同一目标变量,响应于确定存在被预设的保护函数所保护的该目标变量的第四位置,且第三位置到第四位置的操作路径是可达的,并且在第三位置和第四位置之间不存在对该目标变量进行释放保护操作,确定存在并发缺陷,并将第三位置和第四位置确定为并发缺陷的位置;输出第三预设值以及第三位置和第四位置。
进一步地,输出单元进一步被配置成:根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定每个函数的调用序列之内,同一通道变量的关闭操作与读操作或者写操作之间是否存在可达的路径;响应于确定存在可达的路径,确定存在并发缺陷,并确定关闭操作的第五位置与读操作的第六位置或写操作的第七位置,并将第五位置与第六位置或第七位置确定为并发缺陷的位置;输出第四预设值以及第五位置与第六位置或第七位置。
一种程序并发缺陷检测的电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,处理器执行程序时实现如上述的程序并发缺陷检测方法。
一种非暂态计算机可读存储介质,其特征在于,非暂态计算机可读存储介质存储计算机指令,计算机指令用于使计算机执行如上述的程序并发缺陷检测方法。
从上面可以看出,本说明书一个或多个实施例提供的,一种程序并发缺陷检测方法、装置、设备以及存储介质,通过调用函数调用序列链表、代码块调用序列数组以及预设条件,对程序中源代码进行深层次的分析和检测,可以实现快速、准确地确定程序并发缺陷发生的类型以及位置,以便于及时处理缺陷,确保程序的健壮性和可靠性。
附图说明
为了更清楚地说明本说明书一个或多个实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书一个或多个实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本说明书一个实施例示出的程序并发缺陷检测方法的流程示意图;
图2为本说明书另一个实施例示出的程序并发缺陷检测方法的流程示意图;
图3为本说明书一个实施例示出的程序并发缺陷检测装置的结构框图;
图4为本说明书一个实施例示出的程序并发缺陷检测的电子设备硬件结构示意图。
具体实施方式
为使本公开的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本公开进一步详细说明。
需要说明的是,除非另外定义,本说明书一个或多个实施例使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本说明书一个或多个实施例中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
图1示出了根据本申请的程序并发缺陷检测方法的一个实施例的流程100。本实施例的输电线路巡检方法,包括以下步骤:
步骤101,获取目标检测数据以及获取目标检测数据中的函数。
本实施例中,程序并发缺陷检测方法的执行主体可以是服务器或终端设备。执行主体可以通过有线或无线的方式获取目标检测数据以及获取目标检测数据中的函数。具体地,目标数据可以是待检测静态单赋值(SSA)中间代码。在静态单赋值中间代码中,一个程序由多个包组成,一个包由多个函数组成,一个函数由多个代码块组成,一个代码块由多个指令组成。
步骤102,根据目标检测数据以及函数之间的调用关系,得到函数调用序列链表。
执行主体在得到目标检测数据后,可以首先将目标检测数据加载到检测程序中(目标检测数据中包含静态单赋值中间代码生成的所有的包、函数、变量、代码块和代码调试信息等内容),然后遍历每个的包中包含的函数都加载到一个数组中,最后把源代码所有的函数汇集到一个数组中;在静态单赋值(SSA)中间代码中,每个包可以包含多个函数,一个函数可以包含多个代码块,一个代码块包含多个指令,每个块中的代码指令是顺序执行的。
示例的,Go程序从main函数开始执行,首先以main函数为起点,遍历main函数中第一个代码块中的每条指令,如果遇到是call开头的指令表示是对某个函数的调用,call指令之后是表示被调用的函数的名字,将函数的名字作为一个节点链接到main节点后面,继续分析下一条指令,如果遇到call指令做法如上,如果遇到结束指令就继续读下一代码块;依照此类方法对每个函数都生成了一个调用序列链表,然后将此调用序列保存到一个数据结构中,函数的名字是索引,函数的调用序列链表是值。函数调用序列链表,具体地,可以表示函数之间的调用关系,例如A函数调用了B函数C函数,那么会生成一个数据结构{“A”:[“B”,“C”]},表示通过A函数可以执行到B函数和C函数。其中“A”是索引,[“B”,“C”]是值,“索引”和“值”用于验证某一个函数到另一个函数是否存在调用路径,即用于验证一个函数到另一个函数是否是可达的。例如,当判断A函数与D函数是否存在调用序列时,在某个程序代码中存在以下调用序列表{“A”:[“B”,“C”],“C”:[“D”],“E”:[“F”]},从表中就可以分析到A-C-D就存在一个调用路径,即A-C-D是可达的。函数调用序列链表,示例的,可以是{“A”:[“B”,“C”],“C”:[“D”],是针对每一个函数的可调用的序列链表。
步骤103,获取每个函数中的代码块。
步骤104,根据函数以及代码块之间的调用关系,得到代码块调用序列数组。
在静态单赋值(SSA)中间代码中,函数的代码块都有编号,每个代码块都会有该代码块之前的代码块的编号以及该代码块结束之后的要执行的代码块编号。在实际执行时,入口代码块会首先被执行,在一个代码块内部的指令是顺序执行的,代码块的最后一个指令会表示该代码块执行结束之后的下一个代码块是哪些。代码块调用序列数组,就是分别将每个函数中的这些先后执行的代码块连接起来组成代码块调用链表,然后将每个函数中的各代码块调用链表组合起来得到代码块调用序列数组。示例的,有个3函数F1、F2和F3;F1有四个代码块[A,B,C,D];F2有3个代码块[E,F,G];F3有5个代码块[H,I,J,K,L]。F1存在两条代码块调用链表:[[A,B,C,D],[A,B,D]];F2存在两条代码块调用链表:[[E,F,G],[E,G]];F3存在三条代码块调用链表:[[H,I,K,L],[H,J,K,L],[H,J,L]];最后将各代码块调用链表组合生成数组:[[[A,B,C,D],[A,B,D]],[[E,F,G],[E,G]],[[H,I,K,L],[H,J,K,L],[H,J,L]]]。
步骤105,根据目标检测数据、函数调用序列链表、代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出。
执行主体在得到函数调用序列链表和代码块调用序列数组后可以根据目标检测数据、函数调用序列链表、代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出。具体地,并发缺陷可以为:共享变量忘记保护、忘记释放锁资源、两次申请同一锁资源和关闭通道后再写入通道或读通道操作等四种模式,具体地,可以分为以下四种并发缺陷:(1)Go语言支持用户定义struct数据结构,在struct数据结构中可以定义一些共享的变量,在每次使用共享变量之前都会用Go语言中的Mutex、RWMutex或者Atomic的接口(Mutex、RWMutex或者Atomic这三个接口是Go语言提供给开发者用于对变量进行保护的函数,是一种并发编程中的同步原语,能保证多个线程在访问同一片内存时不会出现竞争条件等问题)对共享变量进行保护。其并发缺陷可以是可能在使用某些共享变量时使用了锁资源,而对需要保护的另外一些共享变量没有使用锁资源,导致出现数据竞争的缺陷。(2)忘记释放锁资源的错误模式是在同一条函数的调用序列之内,申请了某个锁资源但是在调用序列结束之前并没有释放这个锁资源,例如对同一条函数的调用序列调用了Mutex和RWMutex的Lock接口,但在该函数的调用序列结束之前并没有调用Unlock接口。(3)两次申请同一锁资源的错误模式是在同一条函数的调用序列之内,两次都申请同一个锁资源,同时满足在两次申请之间并没有出现释放这个锁资源的操作。(4)在Go语言中,通道通常是用来传递消息的一种方式,通道支持三种操作,写入,读取和关闭。如果对某一个通道进行了关闭就不能再向该通道读取,也不能对该通道写入,否则会发生错误。关闭通道后再写入通道或读取通道的操作是在同一条函数的调用序列之内先关闭了通道,在关闭通道后又写入或者读取通道,这会导致并发缺陷。
本实施例通过调用函数调用序列链表、代码块调用序列数组以及预设条件,对程序中源代码进行深层次的分析和检测,可以实现快速、准确地确定程序并发缺陷发生的类型以及位置,以便于及时处理缺陷,确保程序的健壮性和可靠性。
继续参见图2,其示出了根据本申请的程序并发缺陷检测方法的另一个实施例的流程200。如图2所示,本实施例的程序并发缺陷检测方法可以包括以下步骤:
步骤201,获取目标检测数据以及获取目标检测数据中的函数。
具体地,步骤201可以通过以下步骤来实现:获取压缩源代码数据;解压压缩源代码数据,得到解压源代码数据;编译解压源代码数据,得到目标检测数据,并获取。具体地,执行主体首先获取待检测程序,将待检测程序使用常用的压缩工具进行压缩得到压缩源代码数据,并上传到指定目录,压缩格式例如可以是zip、rar或7z。经过压缩的待检测程序方便传输,降低传输过程中由于文件过于零散或者文件过多带来传输延时,可以简化检测的准备过程。执行主体获取上传到指定目录并经过压缩的待检测程序,也就是压缩源代码数据,首先,执行主体对压缩源代码数据识别压缩格式,例如压缩格式是zip、rar或者7z等格式,然后按照对应的格式使用解压工具将压缩源代码数据解压到固定的目录下,得到解压源代码数据。对该解压源代码数据,使用Go自带的编译器进行编译处理,生成静态单赋值(SSA)中间代码即为目标检测数据。
步骤202,根据目标检测数据以及函数之间的调用关系,得到函数调用序列链表。
步骤201~步骤202的原理与步骤101~步骤102的原理相同,在此不再赘述。
具体地,步骤202可以通过步骤2021~步骤2023来实现:
步骤2021,确定目标检测数据中的目标函数。
步骤2022,以目标函数为初始节点,将目标函数中第一个代码块中的第一个目标指令所指示的函数确定为第一节点,将目标函数中最后一个代码块中的最后一个目标指令所指示的函数确定为第N节点。
其中,N为正整数。
步骤2023,根据目标函数中代码块之间的调用顺序以及每个代码块中目标指令的执行顺序,将第一节点至第N节点依次链接至初始节点,得到函数调用序列链表。
本实施例中,示例的,目标函数可以是main函数,Go程序的入口是main函数。以main函数为初始起点,遍历main函数中第一个代码块中的每条指令,找到call开头的指令即为目标指令,将main函数中第一个代码块中的第一个call指令所指示的函数确定为第一节点,将第一节点链接到初始节点后面,继续遍历每一条指令,遇到call指令,做法同上,根据main函数中第一个代码块中最后一条指令所指示的代码块编号,确定第二个代码块,对第二个代码块执行跟第一个代码块同样的操作,直至遍历该main函数中的所有代码块,遇到call指令,做法同上,得到main函数中最后一个代码块中的最后一个目标指令所指示的函数并确定为第N节点,将第一节点至第N节点依次链接到初始节点上,得到该main函数的函数调用序列链表。针对每个函数都执行跟main函数同样的操作,得到每一个函数的函数调用序列链表。
本实施例通过遍历目标检测数据中的每一个函数中的每个代码块中的每条指令,得到目标检测数据中的每个函数的调用序列链表,可以根据每个函数的调用序列链表确定函数之间的可达性,为并发缺陷的检测打好基础,提高对并发缺陷检测的速度和准确性。
步骤203,获取每个函数中的代码块。
步骤204,根据函数以及代码块之间的调用关系,得到代码块调用序列数组。
步骤203~步骤204的原理与步骤103~步骤104的原理相同,在此不再赘述。
本实施例中,每个代码块包括第一代码块标识和第二代码块标识。
具体地,步骤204可以通过步骤2041~步骤2046来实现:
步骤2041,对于每个函数,将函数中的第一个代码块确定为第一元素。
步骤2042,根据函数中已执行的第n-1个代码块以及第二代码块标识,确定函数中将要执行的第n个代码块。
本实施例中,第一代码块标识可以是当前代码块之前的代码块的编号,第二代码块标识可以是当前代码块之后要执行的代码块的编号。本实施例是针对每个函数,将函数中的第一个代码块确定为第一元素,也就是代码块调用序列数组中的第一个代码块。根据第n-1个代码块和第二代码块标识,也就是第n-1个代码块之后的下一个将要执行的代码块的标识确定第n个代码块。其中,第n个代码块中不包括第二代码块标识,其中,n为大于等于2的正整数。这里假设第n个代码块是该函数中的最后一个代码块。也就不包括第二代码标识了。
步骤2043,将函数中的第n-1个代码块确定为第n-1元素。
步骤2044,将函数中的第n个代码块确定为第n元素。
步骤2045,根据第一元素至第n-1元素、第n元素以及代码块之间的调用关系,确定代码块调用序列子数组。
步骤2046,组合每个函数对应的代码块调用序列子数组,得到代码块调用序列数组。
根据上述假设,这里第n-1个代码块即为该函数中的倒数第二个代码块,将其确定为该函数的代码块调用序列数组中的第n-1元素,则第n个代码块即为该函数中的最后一个代码块,将其确定为该函数的代码块调用序列数组中的第n元素。将第一元素、…、第n-1元素、第n元素依次按照对应代码块的调用顺序链接起来得到该函数的代码块调用序列子数组,值得注意的是,该函数的代码块调用序列子数组可以不只一个,可能有多个。对目标检测数据中的每个函数都对应生成一个或多个代码块调用序列子数组。然后将每个函数的各代码块调用序列子数组组合起来,得到代码块调用序列数组。
本实施例通过得到代码块调用序列数组可以得到每个函数内部的代码块之间的可达性,为并发缺陷的检测打好基础,提高并发缺陷检测的准确性和速度。
步骤205,根据目标检测数据、函数调用序列链表、代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出。
具体地,步骤205可以通过以下图2中未示出的步骤来实现:
根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定目标检测数据中是否含有预设的保护函数;
响应于确定目标检测数据中含有预设的保护函数,确定预设的保护函数所保护的目标变量;
获取目标检测数据中所有的目标变量;
对于每个目标变量,响应于确定该目标变量没有被预设的保护函数保护,确定存在并发缺陷,并将该目标变量的位置确定为并发缺陷的位置。
输出第一预设值以及没有被预设的保护函数保护的目标变量的位置。
本实施例是共享变量忘记保护的情况,具体地:预设的保护函数可以是Mutex、RWMutex或者Atomic,也称锁并发原语。预设的保护函数所保护的目标变量可以是开发者定义的一些共享的变量。在每次使用共享变量之前都会用Mutex、RWMutex或者Atomic接口对共享的变量进行保护。在本实施例中,示例的,执行主体在得到函数调用序列链表和代码块调用序列数组后,可以首先识别静态单赋值(SSA)中间代码中所有的struct类型的数据结构,然后判断识别出的struct类型的数据结构中是否存在Mutex、RWMutex或者Atomic类型的函数(简称锁并发原语)。如果一个struct类型的数据结构中包含Mutex、RWMutex或者Atomic类型的函数即包含锁并发原语类型的变量,表示开发者希望使用锁并发原语保护其中某些变量。遍历所有待检测程序的SSA代码的所有函数查找被锁并发原语保护的变量,具体做法如下:首先收集锁并发原语Mutex和RWMutex中申请锁资源Lock操作的代码位置,然后查找对应可能释放锁资源Unlock操作的位置,通过函数调用序列链表和函数内部的代码块调用序列数组查找Lock和Unlock操作之间的可达性(可达指的是:存在一条调用序列,两个指令之间存在一条路径),如果可达,分析可达路径之间是否存在与被锁并发原语保护的变量同struct类型的变量,如果有同struct类型的变量,说明这个变量属于被保护的对象之一,也是开发者定义的共享变量。遍历过程中,如果遇到Atomic指令操作的变量,可以通过SSA代码的指令分析接口直接获取被操作的变量的类型,那么该变量在使用时必须要有锁并发原语保护,也是开发者定义的共享变量。遍历所有的SSA代码,查找没有被锁并发原语保护的与被锁并发原语保护的变量同struct类型的共享变量。如果查找到,则此类型的共享变量的位置就是并发缺陷出现的位置,通过调用SSA指令的接口可以输出此类型的共享变量所属的文件以及在文件中的行数。本实施例,引入一些编号机制,例如发现并发缺陷时,输出:类型-编号或者只输出编号,然后根据类型与编号的对应关系确定类型。类型包括忘记释放锁资源、双重锁和关闭通道后再写入通道或读通道操作。示例的,第一预设值可以为:共享变量缺少保护-1,当然,也可以只输出1。编号机制:从1开始递增,例如一共发现了两个共享变量缺少保护,其编号可以为1-1和1-2。没有被预设的保护函数保护的目标变量的位置即可以为未被锁并发原语保护的共享变量所属的文件以及在文件中的行数。
具体地,步骤205可以通过以下图2中未示出的步骤来实现:
对于每个函数,根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定被预设的保护函数所保护的目标变量的第一位置;确定每个函数中的程序结束指令所指示的第二位置;响应于确定在第一位置和第二位置之间不存在对目标变量进行释放保护操作,确定存在并发缺陷,并将第一位置确定为并发缺陷的位置;输出第二预设值以及第一位置。
本实施例是针对每个函数,忘记释放锁并发原语的情况,具体地:预设的保护函数可以是Mutex、RWMutex或者Atomic,也称锁并发原语。第一位置是锁并发原语对目标变量进行保护的位置。第二位置是该函数的最后一个代码块的最后一个指令结束的位置。在第一位置对目标变量也就是共享变量进行了锁并发原语的保护,但是在该函数调用序列结束即到main函数的结束之间没有使用Unlock操作对共享变量释放锁并发原语。则确定存在忘记释放锁并发原语的缺陷,并将第一位置确定为并发缺陷的位置。示例的,本实施例中,执行主体在得到函数调用序列链表和代码块调用序列数组后,可以首先在SSA形式下,遍历每个函数中所有的指令,识别Mutex和RWMutex变量的Lock操作,然后提取其中被保护的共享变量以及确定其中被保护的共享变量的位置。通过函数调用序列链表分析从Lock操作开始到整个函数调用序列结束即到main函数的结束之间是否没有使用Unlock操作对该共享变量进行释放锁并发原语操作。如果存在此类情况,即为忘记释放锁并发原语的并发缺陷。通过调用SSA指令的接口可以输出Lock操作所在的文件以及在文件中的行数等信息即第一位置。本实施例,引入一些编号机制,例如发现并发缺陷时,输出:类型-编号或者只输出编号,然后根据类型与编号的对应关系确定类型。类型包括共享变量缺少保护、忘记释放锁并发原语、双重锁和关闭通道后再写入通道或读通道操作。示例的,第二预设值可以为:忘记释放锁并发原语-2,当然也可以为2。编号机制:从1开始递增,例如一共发现了两个忘记释放锁并发原语,其编号可以为2-1和2-2。
具体地,步骤205可以通过以下图2中未示出的步骤来实现:
根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定被预设的保护函数所保护的目标变量的第三位置;对于同一目标变量,响应于确定存在被预设的保护函数所保护的该目标变量的第四位置,且第三位置到第四位置的操作路径是可达的,并且在第三位置和第四位置之间不存在对该目标变量进行释放保护操作,确定存在并发缺陷,并将第三位置和第四位置确定为并发缺陷的位置;输出第三预设值以及第三位置和第四位置。
本实施例是针对每个函数,双重锁并发原语的情况,具体地:预设的保护函数可以是Mutex、RWMutex或者Atomic,也称锁并发原语。第三位置是共享变量某次被锁并发原语保护的位置,第四位置是同一共享变量另一次被锁并发原语保护的位置。通过调用函数调用序列链表和代码块调用序列数组分析同一变量的某次的锁并发原语保护操作到另一次锁并发原语保护操作的路径是可达的,并且,两次操作之间没有对这个锁并发原语进行释放的操作,则确定存在双重锁并发原语的并发缺陷。示例的,本实施例中,执行主体在得到函数调用序列链表和代码块调用序列数组后,可以遍历SSA中所有的指令,识别Mutex变量的Lock操作,然后提取其中被保护的共享变量以及被保护的共享变量的位置。通过函数调用序列链表和函数内部的代码块调用序列数组分析同一共享变量的某次锁并发原语的Lock操作到另一次锁并发原语Lock操作的路径是可达的,并且两次操作之间没有对这个锁并发原语的进行释放的操作。如果存在此类情况,即为双重锁并发原语的并发缺陷。通过调用SSA指令的接口可以输出存在双重锁并发原语的并发缺陷的某次Lock操作和另一次Lock操作所在的文件以及在文件中的行数等信息,分别为第三位置和第四位置。本实施例,引入一些编号机制,例如发现并发缺陷时,输出:类型-编号或者只输出编号,然后根据类型与编号的对应关系确定类型。类型包括共享变量缺少保护、忘记释放锁并发原语、双重锁并发原语和关闭通道后再写入通道或读通道操作。示例的,第三预设值可以为:双重锁并发原语-3,当然也可以为3。编号机制:从1开始递增,例如一共发现了两个双重锁并发原语,其编号可以为3-1和3-2。
具体地,步骤205可以通过以下图2中未示出的步骤来实现:
根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定每个函数的调用序列之内,同一通道变量的关闭操作与读操作或者写操作之间是否存在可达的路径;响应于确定存在可达的路径,确定存在并发缺陷,并确定关闭操作的第五位置与读操作的第六位置或写操作的第七位置,并将第五位置与第六位置或第七位置确定为并发缺陷的位置;输出第四预设值以及第五位置与第六位置或第七位置。
本实施例是针对每个函数,关闭通道后再写入通道或读通道操作的情况,具体地:执行主体在得到函数调用序列链表和代码块调用序列数组后,可以遍历SSA中所有的指令,识别对通道变量的写入、读取和关闭操作。然后按照对同一通道变量的操作进行分组(例如:通道Channel A[instrution1,instrution2,instrution3],其中instruction1、2、3对Channel A进行读取、写入或者关闭操作;通道Channel B[instrution11,instrution12,instrution13],其中instruction11、12、13对Channel B进行读取、写入或者关闭操作)。通过函数调用序列链表和函数内部的代码块调用序列数组分析同一通道变量的关闭操作与读操作或者写操作之间是否存在可达的路径。如果存在此类情况,即为关闭通道后再写入通道或读通道操作的并发缺陷。通过调用SSA指令的接口可以输出关闭操作和读或者写入操作所在的文件以及在文件中的行数等信息,即输出关闭操作的第五位置、输出读操作的第六位置以及输出写入操作的第七位置。本实施例,引入一些编号机制,例如发现并发缺陷时,输出:类型-编号或者只输出编号,然后根据类型与编号的对应关系确定类型。类型包括共享变量缺少保护、忘记释放锁并发原语、双重锁并发原语和关闭通道后再写入通道或读通道操作。示例的,第四预设值可以为:关闭通道后再写入通道或读通道操作-4,当然也可以为4。编号机制:从1开始递增,例如一共发现了两个关闭通道后再写入通道或读通道操作,其编号可以为4-1和4-2。
根据上述提到的并发缺陷的检测结果,可以给出对应的修复建议。其中共享变量缺少保护的并发缺陷建议开发者在缺少保护的共享变量的使用位置给予提示,需要使用struct类型的某个锁并发原语对其进行保护;对于忘记释放锁并发原语的并发缺陷,建议开发者在出现忘记Unlock操作的Lock操作位置提醒开发者忘记释放了该锁并发原语,在使用完之后应该尽快释放该资源;对于双重锁并发原语的并发缺陷,建议开发者在第一个Lock和第二个Lock之间应该先对第一个Lock进行Unlock之后进行第二个Lock操作;对于关闭通道后再写入通道或读通道操作的并发缺陷建议开发者检测通道close操作是否应该在读取和写入之后,否则会程序会出现崩溃现象。
本实施例通过总结程序的并发缺陷模式,并结合函数调用序列数组以及代码块调用序列数组,可以快速、准确的确定程序的并发缺陷的类型以及并发缺陷的位置,以便于及时地处理缺陷,保证程序的健壮性和可靠性。
继续参见图3,作为对上述各图所示方法的实现,本申请提供了一种程序并发缺陷检测装置的一个实施例,该装置实施例与图1所示的方法实施例相对应,该装置具体可以应用于各种电子设备中。
如图3所示,本实施例的输电线路巡检装置300包括:获取单元301、函数调用序列链表确定单元302、代码块调用序列数组确定单元303、输出单元304。
获取单元301,被配置成获取目标检测数据以及获取目标检测数据中的函数;以及获取每个函数中的代码块。
函数调用序列链表确定单元302,被配置成根据目标检测数据以及函数之间的调用关系,得到函数调用序列链表。
代码块调用序列数组确定单元303,被配置成根据函数以及代码块之间的调用关系,得到代码块调用序列数组。
输出单元304,被配置成根据目标检测数据、函数调用序列链表、代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出。
在本实施例的一些可选的实现方式中,获取单元301进一步被配置成:获取压缩源代码数据;解压压缩源代码数据,得到解压源代码数据;编译解压源代码数据,得到目标检测数据,并获取。
在本实施例的一些可选的实现方式中,函数调用序列链表确定单元302进一步被配置成:确定目标检测数据中的目标函数;以目标函数为初始节点,将目标函数中第一个代码块中的第一个目标指令所指示的函数确定为第一节点,将目标函数中最后一个代码块中的最后一个目标指令所指示的函数确定为第N节点,N为正整数;根据目标函数中代码块之间的调用顺序以及每个代码块中目标指令的执行顺序,将第一节点至第N节点依次链接至初始节点,得到函数调用序列链表。
在本实施例的一些可选的实现方式中,每个代码块包括第一代码块标识和第二代码块标识;以及代码块调用序列数组确定单元303进一步被配置成:对于每个函数,将函数中的第一个代码块确定为第一元素;根据函数中已执行的第n-1个代码块以及第二代码块标识,确定函数中将要执行的第n个代码块,其中,第n个代码块中不包括第二代码标识,其中,n为大于等于2的正整数;将函数中的第n-1个代码块确定为第n-1元素;将函数中的第n个代码块确定为第n元素;根据第一元素至第n-1元素、第n元素以及代码块之间的调用关系,确定代码块调用序列子数组;组合每个函数对应的代码块调用序列子数组,得到代码块调用序列数组。
在本实施例的一些可选的实现方式中,输出单元304进一步被配置成:根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定目标检测数据中是否含有预设的保护函数;响应于确定目标检测数据中含有预设的保护函数,确定预设的保护函数所保护的目标变量;获取目标检测数据中所有的目标变量;对于每个目标变量,响应于确定该目标变量没有被预设的保护函数保护,确定存在并发缺陷,并将该目标变量的位置确定为并发缺陷的位置;输出第一预设值以及目标变量的位置。
在本实施例的一些可选的实现方式中,输出单元304进一步被配置成:对于每个函数,根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定被预设的保护函数所保护的目标变量的第一位置;确定每个函数中的程序结束指令所指示的第二位置;响应于确定在第一位置和第二位置之间不存在对目标变量进行释放保护操作,确定存在并发缺陷,并将第一位置确定为并发缺陷的位置;输出第二预设值以及第一位置;该装置还包括:根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定被预设的保护函数所保护的目标变量的第三位置;对于同一目标变量,响应于确定存在被预设的保护函数所保护的该目标变量的第四位置,且第三位置到第四位置的操作路径是可达的,并且在第三位置和第四位置之间不存在对该目标变量进行释放保护操作,确定存在并发缺陷,并将第三位置和第四位置确定为并发缺陷的位置;输出第三预设值以及第三位置和第四位置。
在本实施例的一些可选的实现方式中,输出单元304进一步被配置成:根据目标检测数据、函数调用序列链表、代码块调用序列数组,确定每个函数的调用序列之内,同一通道变量的关闭操作与读操作或者写操作之间是否存在可达的路径;响应于确定存在可达的路径,确定存在并发缺陷,并确定关闭操作的第五位置与读操作的第六位置或写操作的第七位置,并将第五位置与第六位置或第七位置确定为并发缺陷的位置;输出第四预设值以及第五位置与第六位置或第七位置。
需要说明的是,本说明书一个或多个实施例的方法可以由单个设备执行,例如一台计算机或服务器等。本实施例的方法也可以应用于分布式场景下,由多台设备相互配合来完成。在这种分布式场景的情况下,这多台设备中的一台设备可以只执行本说明书一个或多个实施例的方法中的某一个或多个步骤,这多台设备相互之间会进行交互以完成的方法。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书一个或多个实施例时可以把各模块的功能在同一个或多个软件和/或硬件中实现。
上述实施例的装置用于实现前述实施例中相应的方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
图4示出了本实施例所提供的一种更为具体的电子设备硬件结构示意图,该设备可以包括:处理器1010、存储器1020、输入/输出接口1030、通信接口1040和总线1050。其中处理器1010、存储器1020、输入/输出接口1030和通信接口1040通过总线1050实现彼此之间在设备内部的通信连接。
处理器1010可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。
存储器1020可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1020可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器1020中,并由处理器1010来调用执行。
输入/输出接口1030用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
通信接口1040用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线1050包括一通路,在设备的各个组件(例如处理器1010、存储器1020、输入/输出接口1030和通信接口1040)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器1010、存储器1020、输入/输出接口1030、通信接口1040以及总线1050,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
本实施例的计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本公开的范围(包括权利要求)被限于这些例子;在本公开的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上的本说明书一个或多个实施例的不同方面的许多其它变化,为了简明它们没有在细节中提供。
另外,为简化说明和讨论,并且为了不会使本说明书一个或多个实施例难以理解,在所提供的附图中可以示出或可以不示出与集成电路(IC)芯片和其它部件的公知的电源/接地连接。此外,可以以框图的形式示出装置,以便避免使本说明书一个或多个实施例难以理解,并且这也考虑了以下事实,即关于这些框图装置的实施方式的细节是高度取决于将要实施本说明书一个或多个实施例的平台的(即,这些细节应当完全处于本领域技术人员的理解范围内)。在阐述了具体细节(例如,电路)以描述本公开的示例性实施例的情况下,对本领域技术人员来说显而易见的是,可以在没有这些具体细节的情况下或者这些具体细节有变化的情况下实施本说明书一个或多个实施例。因此,这些描述应被认为是说明性的而不是限制性的。
尽管已经结合了本公开的具体实施例对本公开进行了描述,但是根据前面的描述,这些实施例的很多替换、修改和变型对本领域普通技术人员来说将是显而易见的。例如,其它存储器架构(例如,动态RAM(DRAM))可以使用所讨论的实施例。
本说明书一个或多个实施例旨在涵盖落入所附权利要求的宽泛范围之内的所有这样的替换、修改和变型。因此,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本公开的保护范围之内。
Claims (10)
1.一种程序并发缺陷检测方法,其特征在于,包括:
获取目标检测数据以及获取所述目标检测数据中的函数;
根据所述目标检测数据以及所述函数之间的调用关系,得到函数调用序列链表;
获取每个函数中的代码块;
根据所述函数以及所述代码块之间的调用关系,得到代码块调用序列数组;
根据所述目标检测数据、所述函数调用序列链表、所述代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出。
2.根据权利要求1所述的方法,其特征在于,所述获取目标检测数据,包括:
获取压缩源代码数据;
解压所述压缩源代码数据,得到解压源代码数据;
编译所述解压源代码数据,得到目标检测数据,并获取。
3.根据权利要求1所述的方法,其特征在于,所述根据所述目标检测数据以及所述函数之间的调用关系,得到函数调用序列链表,包括:
确定所述目标检测数据中的目标函数;
以所述目标函数为初始节点,将所述目标函数中第一个代码块中的第一个目标指令所指示的函数确定为第一节点,将所述目标函数中最后一个代码块中的最后一个目标指令所指示的函数确定为第N节点,N为正整数;
根据所述目标函数中代码块之间的调用顺序以及每个代码块中所述目标指令的执行顺序,将所述第一节点至所述第N节点依次链接至所述初始节点,得到函数调用序列链表。
4.根据权利要求1所述的方法,其特征在于,每个代码块包括第一代码块标识和第二代码块标识;以及
所述根据所述函数以及所述代码块之间的调用关系,得到代码块调用序列数组,包括:
对于每个函数,将所述函数中的第一个代码块确定为第一元素;
根据所述函数中已执行的第n-1个代码块以及所述第二代码块标识,确定所述函数中将要执行的第n个代码块,其中,所述第n个代码块中不包括所述第二代码标识,其中,n为大于等于2的正整数;
将所述函数中的第n-1个代码块确定为第n-1元素;
将所述函数中的第n个代码块确定为第n元素;
根据所述第一元素至所述第n-1元素、所述第n元素以及代码块之间的调用关系,确定代码块调用序列子数组;
组合每个函数对应的所述代码块调用序列子数组,得到所述代码块调用序列数组。
5.根据权利要求1~4中任一项所述的方法,其特征在于,所述根据所述目标检测数据、所述函数调用序列链表、所述代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出,包括:
根据所述目标检测数据、所述函数调用序列链表、所述代码块调用序列数组,确定所述目标检测数据中是否含有预设的保护函数;
响应于确定所述目标检测数据中含有预设的保护函数,确定所述预设的保护函数所保护的目标变量;
获取所述目标检测数据中所有的所述目标变量;
对于每个所述目标变量,响应于确定该目标变量没有被所述预设的保护函数保护,确定存在并发缺陷,并将该目标变量的位置确定为并发缺陷的位置;
输出第一预设值以及没有被预设的保护函数保护的目标变量的位置。
6.根据权利要求5所述的方法,其特征在于,所述根据所述目标检测数据、所述函数调用序列链表、所述代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出,包括:
对于每个函数,根据所述目标检测数据、所述函数调用序列链表、所述代码块调用序列数组,确定被所述预设的保护函数所保护的所述目标变量的第一位置;
确定每个函数中的程序结束指令所指示的第二位置;
响应于确定在所述第一位置和所述第二位置之间不存在对所述目标变量进行释放保护操作,确定存在并发缺陷,并将所述第一位置确定为并发缺陷的位置;
输出第二预设值以及所述第一位置;以及
所述方法还包括:
根据所述目标检测数据、所述函数调用序列链表、所述代码块调用序列数组,确定被所述预设的保护函数所保护的所述目标变量的第三位置;
对于同一目标变量,响应于确定存在被所述预设的保护函数所保护的该目标变量的第四位置,且所述第三位置到所述第四位置的操作路径是可达的,并且在所述第三位置和所述第四位置之间不存在对该目标变量进行释放保护操作,确定存在并发缺陷,并将所述第三位置和所述第四位置确定为并发缺陷的位置;
输出第三预设值以及所述第三位置和所述第四位置。
7.根据权利要求6所述的方法,其特征在于,所述根据所述目标检测数据、所述函数调用序列链表、所述代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出,包括:
根据所述目标检测数据、所述函数调用序列链表、所述代码块调用序列数组,确定每个函数的调用序列之内,同一通道变量的关闭操作与读操作或者写操作之间是否存在可达的路径;
响应于确定存在可达的路径,确定存在并发缺陷,并确定所述关闭操作的第五位置与所述读操作的第六位置或所述写操作的第七位置,并将所述第五位置与所述第六位置或所述第七位置确定为并发缺陷的位置;
输出第四预设值以及所述第五位置与所述第六位置或所述第七位置。
8.一种程序并发缺陷检测装置,其特征在于,包括:
获取单元,被配置成获取目标检测数据以及获取所述目标检测数据中的函数;以及获取每个函数中的代码块;
函数调用序列链表确定单元,被配置成根据所述目标检测数据以及所述函数之间的调用关系,得到函数调用序列链表;
代码块调用序列数组确定单元,被配置成根据所述函数以及所述代码块之间的调用关系,得到代码块调用序列数组;
输出单元,被配置成根据所述目标检测数据、所述函数调用序列链表、所述代码块调用序列数组以及预设条件,确定并发缺陷以及并发缺陷的位置,并输出。
9.一种程序并发缺陷检测的电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至7任意一项所述的方法。
10.一种非暂态计算机可读存储介质,其特征在于,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行权利要求1至7任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010937282.3A CN112181808B (zh) | 2020-09-08 | 2020-09-08 | 一种程序并发缺陷检测方法、装置、设备以及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010937282.3A CN112181808B (zh) | 2020-09-08 | 2020-09-08 | 一种程序并发缺陷检测方法、装置、设备以及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112181808A true CN112181808A (zh) | 2021-01-05 |
CN112181808B CN112181808B (zh) | 2022-06-28 |
Family
ID=73920056
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010937282.3A Active CN112181808B (zh) | 2020-09-08 | 2020-09-08 | 一种程序并发缺陷检测方法、装置、设备以及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112181808B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2022206062A1 (zh) * | 2021-03-30 | 2022-10-06 | 深圳前海微众银行股份有限公司 | 一种函数调用关系检测方法及装置 |
CN117707918A (zh) * | 2023-05-29 | 2024-03-15 | 荣耀终端有限公司 | 一种并发缺陷检测方法、测试设备和存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6009269A (en) * | 1997-03-10 | 1999-12-28 | Digital Equipment Corporation | Detecting concurrency errors in multi-threaded programs |
CN101937396A (zh) * | 2010-09-30 | 2011-01-05 | 中国科学院软件研究所 | 软件程序中变量的不安全使用的检测方法 |
CN104484266A (zh) * | 2014-11-07 | 2015-04-01 | 上海交通大学 | 一种锁使用模式自动化静态分析系统 |
CN106021116A (zh) * | 2016-06-07 | 2016-10-12 | 北京信息科技大学 | 复杂系统中不可达函数调用路径检测方法 |
CN106227573A (zh) * | 2016-07-11 | 2016-12-14 | 北京信息科技大学 | 基于控制流图的函数调用路径提取方法 |
-
2020
- 2020-09-08 CN CN202010937282.3A patent/CN112181808B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6009269A (en) * | 1997-03-10 | 1999-12-28 | Digital Equipment Corporation | Detecting concurrency errors in multi-threaded programs |
CN101937396A (zh) * | 2010-09-30 | 2011-01-05 | 中国科学院软件研究所 | 软件程序中变量的不安全使用的检测方法 |
CN104484266A (zh) * | 2014-11-07 | 2015-04-01 | 上海交通大学 | 一种锁使用模式自动化静态分析系统 |
CN106021116A (zh) * | 2016-06-07 | 2016-10-12 | 北京信息科技大学 | 复杂系统中不可达函数调用路径检测方法 |
CN106227573A (zh) * | 2016-07-11 | 2016-12-14 | 北京信息科技大学 | 基于控制流图的函数调用路径提取方法 |
Non-Patent Citations (5)
Title |
---|
TENGFEI TU: "Understanding Real-World Concurrency Bugs in Go", 《HTTPS://DL.ACM.ORG/DOI/10.1145/3297858.3304069》 * |
宋东海等: "一种基于调用链的Java程序数据竞争静态检测算法", 《舰船电子工程》 * |
徐波: "《Go语言从入门到进阶实战(视频教学版)》", 30 June 2018 * |
涂腾飞: "Go语言中的并发问题研究", 《中国博士学位论文全文数据库 信息科技辑》 * |
王鑫: "并发数据访问代码缺陷分析", 《航天控制》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2022206062A1 (zh) * | 2021-03-30 | 2022-10-06 | 深圳前海微众银行股份有限公司 | 一种函数调用关系检测方法及装置 |
CN117707918A (zh) * | 2023-05-29 | 2024-03-15 | 荣耀终端有限公司 | 一种并发缺陷检测方法、测试设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112181808B (zh) | 2022-06-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112181808B (zh) | 一种程序并发缺陷检测方法、装置、设备以及存储介质 | |
US10394694B2 (en) | Unexplored branch search in hybrid fuzz testing of software binaries | |
CN112733158B (zh) | Android系统漏洞检测方法、电子设备及存储介质 | |
CN111124926A (zh) | 模糊测试方法、装置、电子设备及存储介质 | |
CN110597704B (zh) | 应用程序的压力测试方法、装置、服务器和介质 | |
CN114356851A (zh) | 数据文件的存储方法、装置、电子设备及存储介质 | |
CN115618363B (zh) | 漏洞路径的挖掘方法及相关设备 | |
CN113127413A (zh) | 一种运营商数据处理方法、装置、服务器及存储介质 | |
CN112486589A (zh) | 一种系统配置项管理方法、装置、电子设备及存储介质 | |
CN112181479A (zh) | 代码文件版本间差异的确定方法、装置及电子设备 | |
WO2023273621A1 (zh) | 脚本生成方法、装置、设备及介质 | |
CN113051153B (zh) | 一种应用软件漏洞扫描方法及相关设备 | |
JP2018163656A (ja) | 追跡データ表現 | |
CN115659344A (zh) | 一种软件供应链检测方法及装置 | |
CN112463785B (zh) | 一种数据质量监控方法、装置、电子设备及存储介质 | |
KR101858594B1 (ko) | 안티리버싱 코드 검출 방법 및 그 장치 | |
CN114942878A (zh) | 互联网应用的自动化性能测试方法及相关设备 | |
CN113687880A (zh) | 一种调用组件的方法、装置、设备和介质 | |
CN112506806A (zh) | 用于调试程序的方法、电子设备及存储介质 | |
CN110688317A (zh) | 应用界面的测试方法及装置 | |
CN111209062A (zh) | 信息获取方法、装置、电子设备及计算机存储介质 | |
CN111737109A (zh) | 一种集群文件系统测试方法及装置 | |
CN112733145B (zh) | Android应用检测分析方法、电子设备及存储介质 | |
CN115470737B (zh) | 生成数据流图的方法、电子设备及存储介质 | |
CN113886191B (zh) | 一种自动驾驶系统的实时跟踪数据处理方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |