【技术实现步骤摘要】
基于控制流分析的Golang应用同步原语阻塞并发缺陷检测方法
[0001]本专利技术属于程序分析与测试领域,具体涉及一种基于控制流分析的Golang应用同步原语阻塞并发缺陷检测方法。
技术介绍
[0002]Golang语言是由谷歌公司于2009年开源的一门编程语言。随着这些年的发展,由其具有的快速、可靠、高效地构建大型应用软件的特点,它变得越来越受开发者们的喜爱。Golang语言在构建微服务和云系统方面具有很大的应用前景。许多开源的流行的大型应用程序都是实用Golang编写完成,如著名的软件容器Docker和cluster管理工具Kubernetes。但是,由于Golang中goroutine的使用,使得在多线程环境下Golang应用更易产生并发缺陷。因此,对于Golang应用中的并发缺陷的检测的研究十分必要。
[0003]目前,对于Golang中同步原语的使用所导致的阻塞型并发缺陷在学术界没有引起足够的重视。尽管现有工作在围绕由channel引起的阻塞型并发缺陷的检测上具有一定的进展,但几乎没有相关研究对Golang中的同步原语的使用所导致的阻塞型并发缺陷进行检测分析。在静态检测方面,现有的针对Golang应用中的阻塞型并发缺陷在channel的检测上具有较好的覆盖率以及bug发现率,但在同步原语的检测和分析上几乎没有涉足。同时,动态检测方面的研究也主要是围绕对channel造成的bug的检测能力与覆盖率等方面的提升,同样没有对同步原语的使用进行分析检测。
[0004]因此,尽管有很多研究工作提出了 ...
【技术保护点】
【技术特征摘要】
1.一种基于控制流分析的Golang应用同步原语阻塞并发缺陷检测方法,以Golang应用的源文件作为输入,以检测到的阻塞型并发缺陷为输出结果,其特征在于,检测方法如下:静态预分析:使用SSApackage将待测Golang应用的源代码编译为中间层代码SSA的形式,基于SSA,得到Golang应用代码中的control flow graph以及构建出函数的call graph;同步原语的分析:在静态预分析的基础之上,分析出同步原语使用的上下文,保存得到每一个同步操作的上下文信息;再利用并发分析和支配分析获取同步操作之间的执行关系;检测器验证:通过对程序的预分析与同步原语的分析,将检测范围划分为仅与同步原语相关的部分;之后根据不同的同步原语所对应的不同的检测算法,交由不同的检测器检测验证,获得并输出程序中的阻塞型并发缺陷的有关信息。2.根据权利要求1所述的基于控制流分析的Golang应用同步原语阻塞并发缺陷检测方法,其特征在于,所述的使用SSApackage将待测Golang应用的源代码编译为中间层代码SSA的形式,基于SSA,得到Golang应用代码中函数的control flow graph和call graph,具体步骤如下:步骤1
‑
1,利用ssautil package将输入源文件转换为中间层代码表示形式,同时通过对源文件的路径进行分析处理,以获取源文件中所有的package和go文件;步骤1
‑
2,遍历所有package中的go文件,构建待测文件的call graph,同时处理构建失败时的场景;步骤1
‑
3,以待测文件的ssa function作为入口,分析它的每一个basic block,每一条instruction,对instruction的类型和位置进行判断处理,获取待分析同步原语类型相关的instructions的信息。3.根据权利要求1所述的基于控制流分析的Golang应用同步原语阻塞并发缺陷检测方法,其特征在于,所述在静态预分析的基础之上,分析出同步原语使用的上下文,保存得到每一个同步操作的上下文信息;再利用并发分析和支配分析获取同步操作之间的执行关系,具体包括以下步骤:步骤2
‑
1,遍历程序中的每一条ssa instruction,判断该instruction的类型,如果是待分析同步原语的操作,则对该指令进行保存;同时,对其所在的函数节点进行分析,利用control flow graph和happens before原则,判断该指令是否受互斥锁的保护,保存相关信息;同时保存目标指令所在的具体位置,所属的同步变量的信息;步骤2
‑
2,对同一个信号量的同步操作进行并发分析;通过基于call graph和control flow graph的算法进行并发分析,并发分析算法如下:输入为同一个信号量的同步操作,对于同一个信号量的PV操作,通过调用链找到它们在LCA中的调用点,分别记为:callsiteP和callsiteV;(1)根据control flow graph分析,在LCA函数中,callsiteP先于callsiteV执行;同时,根据调用图分析,在LCA函数到P操作的调用链上,存在一个节点是由go func()生成的;则PV操作能并发执行;(2)根据control flow graph分析,在LCA函数中,callsiteP先于callsiteV执行;同时,根据调用图分析,在LCA函数到V操作的调用链上,存在一个节点是由go func()生成
的;则PV操作不能并发执行;(3)根据control flow graph分析,在LCA函数中,callsiteV先于callsiteP执行;同时,根据调...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。