基于全局分析的并行错误模式匹配方法与流程

文档序号:11774372阅读:205来源:国知局
基于全局分析的并行错误模式匹配方法与流程

本发明涉及一种并行错误模式匹配方法,特别涉及一种基于全局分析的并行错误模式匹配方法。



背景技术:

并行处理方式在多核技术快速发展的当下,得到了广泛应用。因此,对于并行程序的检测显得格外重要。

在并行程序测试领域已有相应的成果出现。吴萍等人在文献“多线程程序数据竞争的静态检测.计算机研究与发展,2006,43(2):329-335”中提出了一个针对数据竞争的静态检测框架,通过构造跨线程调用图和控制流图,搜集每个程序点的同步对象。之后为各个线程节点收集全局量访问信息和全局量访问事件,最后根据竞争条件给出竞争对。此数据竞争静态检测方法虽然可以在有效的时间内对中小规模的程序取得精确分析结果,但是对一些实际应用规模的程序没有进行检测,检测的范围还很有限。此外,由于并行缺陷的种类繁多,而此方法只针对数据竞争这一种并行错误,导致它的应用范围受限。



技术实现要素:

为了克服现有并行错误模式匹配方法实用性差的不足,本发明提供一种基于全局分析的并行错误模式匹配方法。该方法首先将源程序分解成单词符号串,形成相应的符号表,提供所需的符号节点。接着将输入字符串识别为单词符号流,生成具有中间节点的抽象语法树。再对变量名字和操作符进行处理生成标准形式的抽象语法树。之后,根据生成的抽象语法树对单个过程代码对象构造控制流图。在此基础上,为整个程序代码构建函数调用图,对图中每一个节点的控制流图进行遍历,利用已总结的错误模式与源程序进行匹配得出具体错误的位置。本发明将findbugs作为用户的接口,运用全局分析技术对并行java程序中函数之间的调用关系以及变量之间的影响进行分析,使用并行错误模式与程序当中可能会出现错误的代码进行匹配得出错误定位的结果,实用性好。

本发明解决其技术问题所采用的技术方案:一种基于全局分析的并行错误模式匹配方法,其特点是包括以下步骤:

步骤一、创建抽象语法树。词法分析器逐行对源代码进行自左向右的扫描,将源代码分解成编程语言中一个个字符串形式的基本单词符号。与此同时,词法分析器将这些分解出来的基本单词符号token化,标记基本单词符号所在的行,利用lexer类中的lex方法对token进行访问与查找。将源代码分解成字符串形式的单词符号,并返回一个用来保存词法分析器分解出的所有基本单词符号的tokencollection类型对象。

定义一个四元组(vn,vt,p,s),其中vn为非终结符集,vt为终结符集,且p是形如u:=u的规则集合,满足u∈vn,u∈(vn∪vt)。s是开始符,且s∈vt,vn,vt,p均为有穷非空集。集合p详细地反映了对应编程语言的语法规则和结构,根据集合p反映的规则,编写语法分析程序,将产生的tokencollection类型对象作为语法分析程序的输入,经过分析之后产生单词符号流,生成具有中间节点的抽象语法树。

通过对名字和操作符的处理将具有中间节点的语法树转变为一种标准形式,标准形式中包括表示类型信息的对象和符号表。构建成功的抽象语法树包括多种类型的节点,通过按类型分层的策略来组织各种节点,按照某类节点对应的语义规则设定相应的方法来处理,对同一类型层次上的一系列节点采取同一种语义动作处理。

步骤二、根据已生成的抽象语法树,构建控制流图。使用一个栈跟踪控制流图的生成过程。通过遍历语法树上的每一个节点,根据相应的类型,做出不同的处理:

a)对于表达式节点,首先,构造ast节点所对应的表达式语句的cfg节点。之后,进行栈顶元素的处理,生成之前分析过的节点对应的语句和本表达式语句之间的控制流边,由栈顶的状态和类型,改变或出栈栈顶元素。最后,将表达式语句的cfg节点信息压栈。

b)对于if语句节点,首先,生成if语句的条件语句的cfg节点。处理栈顶元素,生成之前ast节点对应语句和if条件语句之间的控制流边,由栈顶元素的状态和类型,改变或出栈栈顶元素。将if条件语句的cfg节点压栈。之后,递归分析if语句的then部分,生成对应的控制流图。最后,将if语句else部分的边终点语句未处理的控制流边存储到if的条件语句所对应的栈元素的未完成链中,以后处理,栈顶元素出栈。

c)对于while语句,生成while的条件语句的cfg节点。处理栈顶元素,生成之前ast节点对应语句和while条件语句之间的控制流边,由栈顶元素的状态和类型,改变或出栈栈顶元素。将while语句的条件语句的控制流图节点压栈。递归分析while的循环体,生成控制流图。生成栈顶元素对应语句到while条件语句的控制流边,处理一些边终点为while语句的条件语句的控制流边,将其生成,栈顶出栈。

d)对于break语句,生成break语句所对应的cfg节点。处理栈顶元素,生成之前ast节点对应语句和break条件语句之间的控制流边,由栈顶元素的状态和类型,改变或出栈栈顶元素。将break语句的cfg信息压栈。

e)对于continue语句,生成continue语句所对应的cfg节点。处理栈顶元素,生成之前ast节点对应语句和continue条件语句之间的控制流边,由栈顶元素的状态和类型,改变或出栈栈顶元素,将continue语句的cfg信息压栈。

f)对于for语句和do语句,使用while语句的方式进行转换。对于switch语句使用if语句的方式进行转换。最终将抽象语法树转换为对应的控制流图。

步骤三、构造函数调用图。给定一个程序p,将程序p划分为函数p1,p2,…,pn的形式。之后将函数组成相应的集合形式{p1,p2,...,pn},并用n表示,使用s表示调用地点集合,用e表示边的集合且边e=<pi,sk,pj>表示pi中的调用地点sk调用了函数pj。那么p的调用图最后表示为g=<n,s,e>。

步骤四、对函数调用图中节点的控制流图进行遍历同时进行错误模式匹配得出错误定位结果。为了衡量错误定位的效果,定义相应的指标:

a)误报率dr:误报率是指已检测出来的匹配点中,被错误匹配的点的个数ipn(m,a,p)与程序中包含的匹配点数目ip(m,a,p)的比例。p为待测程序,m为缺陷模式,a表示使用的匹配算法。

b)缺陷检测率ddr:缺陷检测率是指正确匹配的点的个数ipy(m,a,p)与程序中包含的匹配点数目ip(m,a,p)的比例。p为待测程序,m为缺陷模式,a表示使用的匹配算法。

c)准确率cr:准确率是指已正确匹配的点的个数ipy(m,a,p)与匹配结果不确定的点的个数ipu(m,a,p)之和与程序中包含的总匹配点数目ip(m,a,p)的比例。p为待测程序,m为缺陷模式,a表示使用的匹配算法。

至此,基于全局分析的并行错误模式匹配完成。

本发明的有益效果是:该方法首先将源程序分解成单词符号串,形成相应的符号表,提供所需的符号节点。接着将输入字符串识别为单词符号流,生成具有中间节点的抽象语法树。再对变量名字和操作符进行处理生成标准形式的抽象语法树。之后,根据生成的抽象语法树对单个过程代码对象构造控制流图。在此基础上,为整个程序代码构建函数调用图,对图中每一个节点的控制流图进行遍历,利用已总结的错误模式与源程序进行匹配得出具体错误的位置。本发明将findbugs作为用户的接口,运用全局分析技术对并行java程序中函数之间的调用关系以及变量之间的影响进行分析,使用并行错误模式与程序当中可能会出现错误的代码进行匹配得出错误定位的结果,实用性好。

本发明采用由软件工程协会总结的java并行错误模式进行具体错误的匹配。已总结的模式分为5类,31种。从中选取4种常见的错误模式作为匹配的模板。之后将服务器软件apachetomcat、开源数据库管理系统apachederby、插件程序pydev、网络框架okhttp和对象池化工具apachecommonspool这些达到实际应用规模的程序作为测试程序。在上述程序中共发现了属于4种错误模式的51个错误实例。实验结果表明,存在于实际应用规模的多线程程序中的多种并行错误类型能够被检测出来,证明此方法具有广泛的应用范围和多样的处理对象。

下面结合附图和具体实施方式对本发明作详细说明。

附图说明

图1是本发明基于全局分析的并行错误模式匹配方法的流程图。

图2是本发明方法进行错误模式匹配的伪代码描述图。

图3是本发明方法所包含的同步可重用对象的并行错误模式的代码描述图。

图4是本发明方法所包含的同步类对象的并行错误模式的代码描述图。

图5是本发明方法所包含的同步固有锁对象的并行错误模式的代码描述图。

图6是本发明方法所包含的非静态对象同步静态对象的并行错误模式的代码描述图。

具体实施方式

参照图1-6。本发明基于全局分析的并行错误模式匹配方法具体步骤如下:

(1)第一步,创建抽象语法树。抽象语法树是处理源程序的过程中广泛使用的一种中间表示形式,其结构不依赖于具体文法。源代码首先由词法分析器(lexer)进行处理,词法分析器将逐行地对源代码进行自左向右的扫描,将源代码分解成编程语言中一个个字符串形式的基本单词符号,如运算符、关键字等。与此同时,词法分析器将这些分解出来的基本元素token化,标记它们所在的行,从而便于利用lexer类中的lex方法实现对token的访问与查找。此方法将源代码分解成字符串形式的单词符号,并返回一个可以用来保存词法分析器分解出的所有符号的tokencollection类型对象。

之后,定义一个四元组(vn,vt,p,s):其中vn为非终结符集,vt为终结符集,且p是形如u:=u的规则集合,满足u∈vn,u∈(vn∪vt)。s是开始符,且s∈vt,vn,vt,p均为有穷非空集。集合p详细地反映了对应编程语言的语法规则和结构,根据集合p反映的规则,编写语法分析程序,将产生的tokencollection类型对象作为语法分析程序的输入,经过分析之后产生单词符号流,生成具有中间节点的抽象语法树。

最后,通过对名字和操作符的处理将具有中间节点的语法树转变为一种标准形式,标准形式中包括表示类型信息的对象和符号表。构建成功的抽象语法树包括多种类型的节点,通过按类型分层的策略来组织各种节点,按照某类节点对应的特定的语义规则来设定相应的方法来处理,对同一类型层次上的一系列节点采取同一种语义动作来处理。

(2)根据已生成的抽象语法树,构建控制流图。在构建过程中,使用一个栈来跟踪控制流图的生成过程。通过遍历语法树上的每一个节点,根据相应的类型,做出不同的处理:

a)对于表达式节点,首先,构造ast节点所对应的表达式语句的cfg节点。之后,进行栈顶元素的处理,生成之前分析过的节点对应的语句和本表达式语句之间的控制流边,由栈顶的状态和类型,改变或出栈栈顶元素。最后将表达式语句的cfg节点信息压栈。

b)对于if语句节点,首先,生成if语句的条件语句的cfg节点。处理栈顶元素,生成之前ast节点对应语句和if条件语句之间的控制流边,由栈顶元素的状态和类型,改变或出栈栈顶元素。将if条件语句的cfg节点压栈。之后,递归分析if语句的then部分,生成对应的控制流图。最后,将if语句else部分的边终点语句未处理的控制流边存储到if的条件语句所对应的栈元素的未完成链中,以后处理,栈顶元素出栈。

c)对于while语句,生成while的条件语句的cfg节点。处理栈顶元素,生成之前ast节点对应语句和while条件语句之间的控制流边,由栈顶元素的状态和类型,改变或出栈栈顶元素。将while语句的条件语句的控制流图节点压栈。递归分析while的循环体,生成控制流图。生成栈顶元素对应语句到while条件语句的控制流边,处理一些边终点为while语句的条件语句的控制流边,将其生成,栈顶出栈。

d)对于break语句,生成break语句所对应的cfg节点。处理栈顶元素,生成之前ast节点对应语句和break条件语句之间的控制流边,由栈顶元素的状态和类型,改变或出栈栈顶元素。将break语句的cfg信息压栈。

e)对于continue语句,生成continue语句所对应的cfg节点。处理栈顶元素,生成之前ast节点对应语句和continue条件语句之间的控制流边,由栈顶元素的状态和类型,改变或出栈栈顶元素,将continue语句的cfg信息压栈。

f)对于for语句和do语句,可以使用while语句的方式进行转换,switch语句可以使用if语句的处理方式进行转换。按照上述处理方式,最终将抽象语法树转换为对应的控制流图。

(3)构造函数调用图。给定一个程序p。将程序p划分为函数p1,p2,…,pn的形式。之后将函数组成相应的集合形式{p1,p2,...,pn},并用n来进行表示,此外使用s表示调用地点集合,用e来表示边的集合且边e=<pi,sk,pj>表示pi中的调用地点sk调用了函数pj。那么p的调用图最后可以表示为g=<n,s,e>。

(4)对函数调用图中节点的控制流图进行遍历同时进行错误模式匹配得出错误定位结果。为了衡量错误定位的效果,定义相应的指标:

a)误报率dr:误报率是指已检测出来的匹配点中,被错误匹配的点的个数ipn(m,a,p)与程序中包含的匹配点数目ip(m,a,p)的比例。p为待测程序,m为缺陷模式,a表示使用的匹配算法。

b)缺陷检测率ddr:缺陷检测率是指正确匹配的点的个数ipy(m,a,p)与程序中包含的匹配点数目ip(m,a,p)的比例。p为待测程序,m为缺陷模式,a表示使用的匹配算法。

c)准确率cr:准确率是指已正确匹配的点的个数ipy(m,a,p)与匹配结果不确定的点的个数ipu(m,a,p)之和与程序中包含的总匹配点数目ip(m,a,p)的比例。p为待测程序,m为缺陷模式,a表示使用的匹配算法。

至此,完成了基于全局分析的并行错误模式匹配方法的全部步骤。

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