一种基于图学习的线程安全代码识别方法

文档序号:25957436发布日期:2021-07-20 17:17阅读:186来源:国知局
一种基于图学习的线程安全代码识别方法

本发明属于软件调试领域,具体涉及一种基于图学习的线程安全代码识别方法。



背景技术:

由于共享内存机制和不确定的线程调度,并发软件难以正确编程、测试和调试。编写一个正确且高效的并发软件是极具挑战性的。通常情况下使用类的开发人员并不总是清楚该类是否是线程安全的,原因是许多类不提供任何或只提供关于其线程安全性的部分信息,据统计目前78%左右的类都是未记录线程安全性的,导致其线程安全性十分模糊,最终会带来可怕的结果。为了加快开发速度并减轻开发困难,编程人员通常使用已经封装好的线程安全类。线程安全类保证了执行行为与线性地调用共享实例上的并发调用方法等价。因此,确保线程安全类的正确性对于保证整个并发软件正确运行是至关重要的。识别可能存在线程安全性问题的代码可以有效缩小错误检测的范围,从而提高并发缺陷检测的效率。

目前,并发缺陷的检测技术日趋成熟,主要分为静态分析、动态分析和二者结合的混合分析。现有的并发缺陷检测方法分别在识别不同规模的可疑代码上做了相关工作,有语句级别、语句块级别和执行序列级别。但都是基于现有的静态分析、动态分析或二者混合分析的方法。静态检测以人为定义的缺陷模式为指导,对所分析文件进行模式提取和对比,以检测并发缺陷。因其相对保守,误报率比较高,有时需要较多的人工干预,但是,静态检测操作简单,计算量相对较少。动态检测通过动态地执行被测程序,以期望能够触发程序异常,并且触发的异常都是真实存在的问题,人工干预度比较低,因此,误报率比较低,但由于并发交错执行的不确定性,漏报率比较高。无论静态分析或动态分析,都会消耗大量的时间和精力。



技术实现要素:

本发明目的:为解决现有静态检测存在的误报率高、人工干预度高等问题以及解决现有动态检测存在的不确定性、漏报率高等问题,本发明提出了一种线程安全代码识别方法,基于现有的大量缺陷数据库中对线程安全类的缺陷报告数据,利用数据挖掘、深度学习等技术,快速有效地检测未知类的线程安全性,并具有构造方式新颖、特征属性提取能力优异、泛化性能和准确度较高等特点。

技术方案:一种基于图学习的线程安全代码识别方法,包括以下步骤:

s100:从开源文档中采集代码以及对应的doc文档,利用爬虫技术,根据预设的关键字筛选出与线程安全性相关的api文档,根据api文档中的描述定位相应的类,对定位的类中线程安全的方法和线程不安全的方法进行人工标记,将人工标签后的类作为数据样本,构建得到线程安全数据集;

s200:将线程安全数据集中的类对应转化为带有安全性标签的域访问图,由所有带有安全性标签的域访问图构建得到匹配池;

s300:构建以域访问图为输入、以相似度为输出的gmn神经网络模型;采用匹配池中的域访问图对构建的gmn神经网络模型进行训练,得到训练好的gmn神经网络模型;

s400:预测未知源代码时,将待安全识别的类对应转化成域访问图,而后输入至训练好的gmn神经网络模型,得到识别结果。

进一步的,所述s200通过以下子步骤实现:

s210:对线程安全数据集中的类进行静态分析,提取出该类的一元属性及二元属性,选择与并发相关的属性;

s220:根据s210得到的属性,将程序元素属性定义为域访问图的顶点,将顶点之间的二元关系定义为域访问图的特殊节点,每个特殊节点采用关系名称进行标记,通过一组有向无标记边连接两个顶点,构造得到类图,记为其中,vc表示类c中的节点集合,ec表示类c中的边集合;

s230:设为类c的域的非空子集,根据类图构造得到单域访问图其中,ef表示连接顶点的边;

s240:按照s230,为类c中的每个域构造一个域访问图,基于类c中方法的标签,为每个域访问图标注标签。

进一步的,所述gmn神经网络模型包括:图编码器、传播器和聚合器;

所述图编码器,以域访问图作为输入,将域访问图中的顶点和边映射为初始顶点向量和边向量;

所述传播器,将图编码器输出的初始顶点向量和边向量进行t轮传播,得到一组顶点的向量表达;

所述聚合器,对传播器输出的顶点的向量表达进行聚合,得到图向量表达;对图向量表达进行相似度度量,得到分类标签。

进一步的,在图编辑器中,对域访问图中的顶点、边进行编码,得到顶点特征向量xi、边特征向量xij;采用mlp算法,将顶点特征向量xi、边特征向量xij映射为初始顶点向量hi(0)和边向量eij:

式中,mlpnode为输出顶点特征向量的多层感知器,mlpedge为输出边特征向量的多层感知器。

进一步的,在传播器中,当进行第t轮传播时:

将顶点向量{hi(t)i∈v}映射到新的顶点向量{hi(t+1)i∈v},表示如下:

mj→i=fmessage(hi(t),hj(t),eij)(4)

hi(t+1)=fnode(hi(t),∑j:(j,i)∈emj→i)(5)

式中,fmessage为将输入信息联系起来的神经网络函数,将两个节点以及连接边作为输入信息得到i→j的向量信息;fnode是一个mlp或递归神经网络核心函数;

其中,公式(5)中的和运算符可由mean、max、基于attention-based的加权和中的任意一个替代。

进一步的,在传播器中,当进行第t轮传播时,增加了交叉图匹配向量进行节点更新:

通过fmatch函数将向量表达转为交叉图信息向量,交叉图信息向量和作为输入,通过fnode函数计算得到新的顶点向量{hi(i+1)i∈v},表示如下:

式中,fmatch是一个交叉信息匹配的函数,用于得出一个图中的节点与另一个图中的一个或多个节点的匹配程度ui→i。

进一步的,在fmatch函数中引入注意力权重aj→i,得到两个不同顶点向量的匹配程度ui→i,表示为:

uj→i=aj→i(hi(t)-hj(t))(10)

式中,sh为向量空间相似性度量函数。

进一步的,在聚合器中,根据下式对传播器输出的顶点的向量表达进行聚合,得到图向量表达:

式中,hg为图向量表达;

根据下式对图向量表达进行相似度度量,得到分类标签lpair:

其中,hg1,hg2为图向量表示,d(hg1,hg2)表示相似度度量,γ>0为边界参数,t∈{-1,1}为基于hg1,hg2的标签产生的相似度,t=1对应相似,t=-1对应不相似。

进一步的,s200中,所述的匹配池由以下步骤构建得到:

为每张域访问图生成对应的label;

根据下式,基于标注了不同标签的域访问图构成匹配池:

matchingset={∑(gi,label=labelgi)}(15)

式中,label=1对应negative标签,label=0对应positive标签,gi对应已标注域访问图。

有益效果:本发明与现有技术相比,具有以下优点:

(1)本发明采用域访问图对并发程序代码段进行表示,通过设计多种类型的节点和边来表达线程安全代码丰富的语法语义信息;

(2)本发明采用gmn训练模型方法,采用向量间的跨图匹配,极大的提高了并发缺陷检测的准确度;

(3)本发明引入关系编码的方法和注意力机制,相比于传统的编码器,引入注意力机制的编码器参数更少,速度更快,对距离较远的结点之间使用关系编码的方法将距离信息编码,使编码器对于结点之间的长距离依赖关系有更强的学习能力。

附图说明

图1为一个实施例中的文档样本;

图2为一个实施例中基于图学习的线程安代码识别技术的流程图;

图3为一个实施例中的线程安全代码片段;

图4为一个实施例中生成的域访问图;

图5为一个实施例中gmn神经网络模型。

具体实施方式

现结合附图和实施例进一步阐述本发明的技术方案。

本实施例以对如图3所示的bank类的线程安全性进行判断为例,来进一步说明本发明提出的一种基于图学习的线程安全代码识别方法的准确性和高效性,具体按照以下步骤执行线程安全性判断:

s100:构建线程安全数据集:从开源文档中采集代码以及对应的doc文档,利用爬虫技术,根据预设的关键字筛选出与线程安全性相关的api文档,根据api文档中的描述定位相应的代码段,从中将线程安全的方法和线程不安全的方法进行人工标记;图1为数据集中一段文档样本。

本实施例预设的关键字为”thread-safe”、”thread-unsafe”、”synchronized”、“lock”、“unlock”、“datarace”、“atomic”、“deadlock”;在其他实施例中,可根据实际情况设置关键字。

s200:域访问图的建立:将线程安全数据集中的线程安全相关性代码转化为可供分析的域访问图结构;具体通过以下子步骤实现:

s210:采用静态分析提取技术,对经s100人工标签处理的代码段分析提取出待分析的程序段的一元属性(unaryproperties)及二元属性(binaryproperties),选择与并发相关的属性,二元属性是基于一元属性产生的,一元属性与二元属性是一种并列关系,与并发相关的属性是它们各自子集的并集。

例如:设c是被分析的类,cf为字段集,cm为方法集,cconst为c定义的类构造函数和静态构造函数集,则c的一元属性集为:cunary=cf∪cm∪cconst;

例如:为了捕捉程序元素属性之间的关系,分析提取了几个二元属性:

设c是被分析的类,cf为字段集,cm为方法集,cconst为c定义的类构造函数和静态构造函数集。定义以下二元关系:

calls表示方法之间的调用关系,表示为:calls:{cconst∪cm}×{cconst∪cm};

reads表示对域的读访问,表示为:reads:{cconst∪cm}×{cf};

writes表示对域的写访问,表示为:writes:{cconst∪cm}×{cf};

sync表示对方法的读写锁保护,表示为:sync:{cm}×{this,lock};

mod表示对静态函数、构造函数、方法、字段的修饰关键字,表示为:mod:{cconst∪cm∪cf}×{public,protected,private,static,volatile,final};

c的二元属性集为:cbinary=calls∪reads∪writes∪sync∪mod。

二元属性捕获了与线程安全预测任务相关的一组丰富的关系,例如,一个方法是否是公共的,一个方法读写什么字段,以及一个方法是否是同步的。

s220:经过s210提取得到的属性,其中:

vc=vrels∪cunary∪{this,lock,public,protected,private,static,volatile,final}表示程序元素及其属性的顶点,vrels={calls,reads,writes,sync,mod}表示cbinary中不同关系的特殊节点;每个特殊节点都用关系的名称(即调用、读取、写入、同步或修饰)进行标记,并通过一组有向无标记边连接两个顶点;特殊节点是包含一类具体二元关系信息的节点。例如属性field定义了顶点va,由属性method定义了顶点vb,而二者间产生了二元关系writes,因此由有一个特殊节点vc包含writes信息。基于上述定义好的顶点和边,构造类图;

给定一类c的域集合cf的非空子集和一类图其中

构造单域访问图该单域访问图包含从f可到达的所有顶点,即并包含连接这些顶点的所有边;

为类c中的每个域构造一个域访问图,保存在磁盘中。并且根据步骤s100中为方法的标签,为域访问图集合中涉及该方法的域访问图人工地标注是否线程安全的标签。

s300:构建如图5所示的gmn神经网络模型,该gmn神经网络模型为学习图中的相似度匹配的一个过程,主要包括图编码器、传播器和聚合器;具体通过以下子步骤实现:

s310:将单域访问图编码为placeholder字典,其中,特征placeholder-tensor是指,通过将原本的节点/边的特征进行转化得到的单热(one-hot)编码:

feature→np.array=[0,1,......,0,0](1)

其中,np.array表示将节点/边的特征编码为一个一维的numpy数组。对于节点属性,数组长度为29,对于边属性,数组长度为17,因此一个域访问图中的特征就被编码为了高维的numpy数组,该数组中每一行对应一个节点/边特征。

s320:输入s200所得的域访问图,编码器通过单独的mlp算法(这里的mlp算法是一种多层感知器,泛称为神经网络)将顶点xi和边特征xij通过相应的算法映射到初始顶点和边向量,hi代表映射之后的顶点向量,eij代表边向量:

式中,xi,xij对应s310中编码产生的特征向量。

s330:经由s320初始化节点之后,传播层将一组顶点表示{hi(t)i∈v}映射到新的顶点表示{hi(t+1)i∈v},表示如下:

mj→i=fmessage(hi(t),hj(t),eij)(4)

hi(t+1)=fnode(hi(t),∑j:(j,i)∈emj→i)(5)

式中,fmessage通常是一个将输入信息联系起来的神经网络函数,将两个节点以及连接边作为输入信息得到i→j的向量信息,fnode是一个mlp或递归神经网络核心函数,例如rnn(recurrentneuralnetwork,一种用于处理序列数据的神经网络)、gru(gatedrecurrentunit,一种门控循环单元)或lstm(longshort-termmemory,一种特殊的rnn),最终输出的hi(t+1)是通过fnode函数处理mi→j边信息以及原始顶点信息hi(t)后输出的节点信息。为聚合信息,使用了一个简单的和,它可以被其他交换运算符替代,例如mean、max或基于attention-based的加权和。通过多层传播,每个节点的表示将在其局部邻域中积累信息。

s340:在gmn模型中增加了交叉图匹配向量,实现传播层中的节点更新模块,具体计算公式如下:

上述式中,fmatch是一个交叉信息匹配的函数,得出一个图中的节点与另一个图中的一个或多个节点的匹配程度,即uj→i。即经过更新后的节点信息hi(t+1)中考虑了边连接信息mj→i和相似度匹配信息uj→i,使得结果更为精确。

在fmatch函数中使用基于attention-based(注意力机制)的模块,首先计算注意力权重aj→i,再通过代入计算得到两个不同点信息的差异信息uj→i,具体如下:

uj→i=aj→i(hi(t)-hj(t))(10)

因此,对得到的值进行累计求和,获得总体交叉图匹配信息uj→i:

上述式子,sh又是一个向量空间相似性度量函数,类似于欧氏或余弦相似性,aj→i是注意力权重,uj→i用来测量hi和它在另外一张图中邻接的差异性。在aj→i的规范化中,函数fmatch隐式地依赖于{hi}的整个集合,在等式中省略了该集合,以获得更清晰的表示法。由于是基于注意力机制,权重会被每对跨图的节点表达访问。

s350:在t轮的传播后,聚合层获得了一组关于顶点的向量表达,随后计算基于顶点hi表达产生的图向量表示。使用如下的聚合模块:

在该mlp聚合模块中,转化顶点hi通过一个带有权重的门控mlp产生筛选了无关信息后的图向量表达hg。

s360:为产生的两个图向量表示hg1,hg2表达进行相似度度量,得出图总体相似度:

s=fs(hg1,hg2)(13)

这里fs是得出hg1和hg2之间的标准向量空间相似性函数,这里的相似度度量函数可以使用海明相似度,欧几里得相似度和余弦相似度,本实施例中使用的是欧几里得相似度。

s370:基于产生的一组图向量表达以及其原本对应的标签,产生lpair:

其中,hg1,hg2为s350中产生的图向量表示,d(hg1,hg2)表示欧几里得距离度量,γ>0为边界参数。t∈{-1,1}为基于hg1,hg2的标签产生的相似度,t=1对应相似,t=-1对应不相似。

s380:经过上述步骤后构建得到gmn神经网络模型后,预处理将要作为匹配池的域访问图。具体操作为:

为每对域访问图基于文档生成对应的标签。根据下式,基于标注了不同标签的域访问图构成匹配池:

matchingset={∑(gi,label=labelgi)}(15)

式中,label=1对应negative标签,label=0对应positive标签,gi表示已标注标签的域访问图。

采用匹配池对构建的gmn神经网络模型进行训练,为训练时的输入设置最大值max_training_step,以确保在训练时不会产生过拟合进而对结果造成不利影响。同时为了完成训练时的模型观测,当训练次数达到max_trainiing_step/10时,产生用于评估模型训练状态的输出,其中包含输入图对的欧几里得距离。

s400:利用训练好的gmn神经网络模型对如图3所示的bank类进行线程安全检测;具体通过以下步骤实现:

s410:将如图3所示的bank类按照s200转化为可供分析的域访问图,得到图4所示以bank_tota1为关键字段的域访问图;

s420:将域访问图输入至训练好的gmn神经网络模型进行线程安全违背检测:

nts_label=[nts_poss-ts_poss]+1(18)

其中,ts_poss、nts_poss为对于任意一张属于匹配池的域访问图与输入图进行相似度比较并且求平均相似度的结果,fs为相似度度量函数,ginput为待预测域访问图,gi指已知标签域访问图,tsmatchingset为所有标签为安全的域访问图集合,ntsmatchingset为所有标签为不安全的域访问图集合,len为集合大小,mean为求平均函数。nts_label∈{0,1}即为域访问图预测产生的标签,0对应线程安全,1对应线程不安全。

最终此bank类分析结果为:

ts_poss=0.000858550413944;nts_poss=0.000916998519896,nts_poss的指数高于ts_poss,据此判断此类为线程不安全类。

通过上述实施例可知,本发明提出的线程安全代码识别方法通过精简待分析类,同时使用静态分析提取技术来实现更加精确直观的图结构,同时选取与输入相匹配的gmn模型进行训练,很好地达到了判别线程安全性的目的,极大的提升了缺陷检测的正确性和效率。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1