基于控制流分析的Golang应用同步原语阻塞并发缺陷检测方法技术

技术编号:37089034 阅读:25 留言:0更新日期:2023-03-29 20:03
本发明专利技术公开了一种基于控制流分析的Golang应用同步原语阻塞并发缺陷检测方法,以Golang源程序作为输入,输出程序中可能存在的阻塞型并发缺陷的信息;输入的源程序首先将被编译为静态单一赋值中间层代码;通过分析中间层代码以获取每个函数的控制流信息以及程序的调用关系;将提取出同步原语在程序中使用的上下文信息;利用过程内控制流分析和call graph分析来对同步操作之间的执行关系进行分析;通过同步原语的类型以及同步操作之间的控制流,利用相应的缺陷检测器进行检测,最后输出程序中含有的阻塞型并发缺陷的具体信息。本发明专利技术提出的方法,能全面、高效地检测Golang应用程序中阻塞型并发缺陷。用程序中阻塞型并发缺陷。用程序中阻塞型并发缺陷。

【技术实现步骤摘要】
基于控制流分析的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]因此,尽管有很多研究工作提出了针对Golang应用中的并发缺陷的检测方法,但它们大多是用于channel相关的并发缺陷的检测。当使用他们的方法进行同步原语的使用所导致的并发缺陷时,无法检测出程序中含有的阻塞型并发缺陷。

技术实现思路

[0005]本专利技术的目的在于提供一种基于控制流分析的Golang应用同步原语阻塞并发缺陷检测方法,用于高效、全面地检测Golang应用中存在的与同步原语相关的阻塞型并发缺陷。
[0006]实现本专利技术目的的技术解决方案为:一种基于控制流分析的Golang应用同步原语阻塞并发缺陷检测方法,以Golang应用的源文件作为输入,以检测到的阻塞型并发缺陷为输出结果,具体步骤如下:
[0007]静态预分析:使用SSApackage将待测Golang应用的源代码编译为中间层代码SSA的形式,基于SSA,得到Golang应用代码中的control flow graph以及构建出函数的call graph;
[0008]同步原语的分析:在静态预分析的基础之上,分析出同步原语使用的上下文,保存得到每一个同步操作的上下文信息;再利用并发分析和支配分析获取同步操作之间的执行关系;
[0009]检测器验证:通过对程序的预分析与同步原语的分析,将检测范围划分为仅与同步原语相关的部分;之后根据不同的同步原语所对应的不同的检测算法,交由不同的检测器检测验证,获得并输出程序中的阻塞型并发缺陷的有关信息。
[0010]第二方面,本专利技术提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面所述的方法的步骤。
[0011]第三方面,本专利技术提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面所述的方法的步骤。
[0012]第四方面,本专利技术提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现第一方面所述的方法的步骤。
[0013]本专利技术与现有技术相比,其显著优点:(1)基于Golang SSApackage,有效分析程序中的同步原语有关的阻塞型并发缺陷,现有工具无法对其进行检测;(2)通过缩小检测范围,能使我们的工具应用到现实世界中的大型Golang应用;(3)测试过程自动化,能全面高效地检测出Golang应用中阻塞型并发缺陷。
附图说明
[0014]图1是本专利技术提供的Golang应用中阻塞型并发缺陷检测方法的流程图。
[0015]图2是构建call graph的代码示例。
[0016]图3是获取WaitGroup类型的同步上下文所定义的结构体代码示例。
[0017]图4是WaitGroup同步原语类型的错误使用导致的并发缺陷代码示例。
[0018]图5是Condition同步原语类型的错误使用导致的并发缺陷代码示例。
[0019]图6是Context库函数的错误使用所导致的并发缺陷代码示例。
具体实施方式
[0020]本专利技术公开了一种Golang阻塞型并发缺陷的静态检测方法,以Golang应用的源文件作为输入,以检测到的阻塞型并发缺陷为输出结果。其整体流程如图1所示。
[0021]其具体实现如下:
[0022]步骤1,静态预分析。使用SSApackage将待测Golang应用的源代码编译为中间层代码SSA的形式,基于SSA,得到Golang应用代码中函数的control flow graph和call graph。具体步骤如下:
[0023]步骤1

1,利用ssautil package将输入源文件转换为中间层代码表示形式,同时通过对源文件的路径进行分析处理,以获取源文件中所有的package和go文件;
[0024]步骤1

2,遍历所有package中的go文件,构建待测文件的call graph,同时处理构建失败时的场景;
[0025]步骤1

3,以待测文件的ssa function作为入口,分析它的每一个basic block,每一条instruction,对instruction的类型和位置进行判断处理,获取待分析同步原语类型相关的instructions的信息。
[0026]步骤2,同步原语的分析:在静态预分析的基础之上,分析出同步原语使用的上下文,保存得到每一个同步操作的上下文信息。再利用并发分析和支配分析获取同步操作之
间的执行关系。具体步骤如下:
[0027]步骤2

1,遍历程序中的每一条ssa instruction,判断该instruction的类型,如果是待分析同步原语的操作,则对该指令进行保存。同时,对其所在的函数节点进行分析,利用control flow graph和happens before原则,判断该指令是否受互斥锁的保护,保存相关信息。同时保存目标指令所在的具体位置,所属的同步变量的信息;
[0028]步骤2

2,对同一个信号量的同步操作进行并发分析。由于Golang应用中goroutine的广泛使用,使得同步操作存在并发执行的可能。此时我们通过基于call graph和control flow graph的算法进行并发分析。该并发分析通过算法1完成。
[0029]算法1:基于call graph和contr本文档来自技高网
...

【技术保护点】

【技术特征摘要】
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执行;同时,根据调...

【专利技术属性】
技术研发人员:邓颖宋巍
申请(专利权)人:南京理工大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1