当前位置: 首页 > 专利查询>武汉大学专利>正文

一种基于贝叶斯网络推理的软件错误分层诊断方法技术

技术编号:15956074 阅读:58 留言:0更新日期:2017-08-08 09:55
本发明专利技术涉及一种基于贝叶斯网络推理的软件错误分层诊断方法,包括构建函数层,MIC理论的应用,提高统计依赖的准确度,改进并应用Laplace平滑策略,解决测试数据稀松性。进行测试预言,判断某测试用例对整个程序是否为失败测试用例。进行错误定位,计算函数的可疑度并排序,构建对应函数的语句层BNPDG,按可疑度排序对函数进行逐一检查,在函数的语句层BNPDG上进行测试预言,找到bug函数,在其语句层BNPDG上进行错误定位,得到函数中所有语句的可疑度排序。按照可疑度排序对语句进行逐一检查,直到找到bug语句。本发明专利技术减少了错误诊断的空间消耗和时间消耗。解决了RankCP等技术中计算的局部可疑度存在的问题。

【技术实现步骤摘要】
一种基于贝叶斯网络推理的软件错误分层诊断方法
本专利技术属于软件工程软件测试
,特别是涉及一种基于贝叶斯网络推理的软件错误分层诊断方法。
技术介绍
(1)软件测试技术一个完整的软件开发周期分为六个阶段:问题的定义与规划、需求分析、软件设计、程序编码、软件测试与运行维护。其中,软件测试作为软件面向用户前的最后一个步骤,决定着软件的质量,在整个软件开发周期中显得尤为重要。伴随商业软件的不断发展,软件的复杂度越来越高,开发周期越来越短,用户对软件的要求也越来越严格,这无疑更进一步提升了软件测试的重要程度。软件测试包含三个主要任务:测试、调试和验证。其中调试工作最为困难,最为耗时,需要的代价也最高。因为,测试和验证过程通常采用黑盒方式进行,只需要考察软件在特定输入下是否产生了正确的输出结果,不需要涉及从输入到输出的复杂过程。然而,调试过程需要定位软件缺陷在代码中的具体位置,必须通过白盒方式完成。黑盒的测试和验证过程与代码量以及代码结构的复杂程度无关。然而,在白盒的调试过程中,代码量的增大会导致调试时间和空间复杂度的增高。并且,复杂的代码逻辑结构也会增加调试的时间复杂度和难度。即白盒调试的复杂度与代码量以及代码结构的复杂程度呈正相关关系。(2)程序错误诊断技术程序错误诊断主要包含错误发现和错误定位两个过程,程序错误的最终修正得益于之前对错误的准确发现和快速定位。因此,程序错误诊断大致包含两个步骤:一是通过分析程序的动态执行行为,鉴别程序是否存在错误;二是一旦明确程序存在错误后,定位错误代码在程序中的具体位置。最初,调试人员完全依靠人工的方式对程序进行查错,例如在源代码中添加print语句、添加断言以及设置断点。这种错误诊断方法需要调试人员对代码充分了解,并且,错误诊断所耗费的时间依赖于调试人员的个人经验。面对大型程序,即使是有经验的调试人员,也无法在短时间内完成调试过程。后来,研究者们开始探索自动化的程序错误诊断技术,试图将乏味的代码调试工作交给电脑自动完成。目前,众多相关研究成果不仅在理论上得到证明,也已经在工业上投入使用,并取得了非常好的效果。常见的自动化错误定位方法主要分为如下两类:1)基于程序执行切片的方法。现阶段有人提出,执行切片指在某个特定测试用例下被执行的代码集合,该集合占所有代码量的百分比被称为该测试用例的代码覆盖。针对某个存在bug的程序,bug所处的代码语句被称为bug语句。该程序的某些测试用例由于执行了bug语句,即bug语句包含在相应的执行切片之中,所以会得到错误的输出结果,这些测试用例被称为失败的测试用例。某些测试用例由于未执行bug语句,即bug语句不包含在相应的执行切片之中,所以会得到正确的输出结果,这些测试用例被称为成功的测试用例。分析可知,失败测试用例的执行切片一定包含bug语句。基于此,通过计算多个不同失败测试用例的执行切片交集,可以缩小程序错误可能存在的代码范围。但是,简单通过这种方法得到的最终可疑代码范围仍然较大,因为大多数测试用例的代码覆盖都比较高,不同测试用例的执行切片拥有较大的交集。2)基于代码可疑度计算的错误诊断方法。现阶段有人提出,如果某条代码语句被越多成功测试用例的执行切片覆盖,那么它就越不可能是bug语句,相反则越有可能是bug语句。于是,他们创新地利用某条代码被成功测试用例覆盖的次数和失败测试用例覆盖的次数来综合衡量该条代码是bug语句的可疑度,取得了非常显著的错误诊断效果。代码的可疑度被认为是该条代码为bug语句的概率。如果一条代码语句的可疑度越高,那么它就越有可能是bug语句,应该优先被调试人员检查。这类错误诊断方法的一般步骤为:首先,计算每条代码语句的可疑度;然后,对程序中所有代码语句按照可疑度的倒序进行排序;最后,调试人员从排序的第一条代码语句开始查找,直到找到程序真正的bug位置。该类方法的核心问题是如何计算代码的可疑度,常见的方法有:(1)TarantulaTarantula方法由Jones等人在2002年提出,并通过大量实验验证了其有效性,成为领域内著名的错误诊断技术。Jones认为,某条程序语句,如果被大多数失败测试用例执行,那么它就很有可能是bug语句。但是,如果它同样也被大多数成功测试用例执行,那么它是bug语句的可能性将降低。Tarantula可疑度的计算如公式所示。其中,e代表一条代码语句,passed(e)代表执行该代码语句的成功测试用例个数,failed(e)执行该代码语句的失败测试用例个数,totalpassed代表总的成功测试用例个数,totalfailed代表总的失败测试用例个数。(2)SOBER代码谓词是指代码中返回布尔值的条件判断语句。程序bug往往与代码谓词息息相关。找到程序执行过程中与bug最相关的谓词,调试人员就很容易找到bug所在的具体位置。因此,很多程序错误诊断技术将寻找bug语句转换为寻找与bug最相关的谓词表达式。SOBER就是计算代码谓词可疑度的程序错误诊断方法。在SOBER方法中,谓词的可疑度被表示为谓词的错误相关性,而谓词的错误相关性用该谓词分别在成功和失败执行过程中的返回值差异来衡量。具体地,如果某代码谓词在成功和失败执行过程中取真值的概率相差较大,则说明其具有较大的错误相关性,也就是具有较大的可疑度。(3)RankCP程序以代码语句为基本组成单位。通过语义分析可知,代码语句之间并不是相互独立的,它们存在一定的依赖关系。Ferrante等人就将代码语句之间的依赖关系定义为控制依赖和数据依赖,并提出了表征程序这两类依赖关系的图模型结构-程序依赖图。Baah等人极具创新地扩展了程序依赖图结构,为之加上概率参数,建立了概率程序依赖图模型,并利用它完成了程序错误诊断工作。基于PPDG的程序错误诊断技术以模型中相邻语句节点之间的条件概率作为代码可疑度的衡量标准。Baah认为,在程序某次失败的执行过程中,如果某节点与其父节点之间的条件概率越小,则该节点所对应的代码语句的可疑度就越高,该条代码语句就越有可能是bug语句。这种可疑度计算方法被称为RankCP。RankCP可疑度的计算方法为公式其中,X表示待计算可疑度的节点,Pa(X)表示X的父节点集合,x表示X在失败执行过程中的状态值,pax表示Pa(X)在失败执行过程中的联合状态值,n(Pa(X)=pax)表示在所有测试用例执行过程中,Pa(X)的状态为pax的次数,n(X=x,Pa(X)=pax)表示在所有测试用例执行过程中,X的状态为x且Pa(X)的状态为pax的总次数。Baah的实验结果显示,RankCP方法在保证效率的前提下,准确率远远优于Tarantula和SOBER,因为它不仅考虑了成功和失败测试用例的执行特点,还充分利用了代码本身的语义信息(控制依赖、数据依赖)。但是,仔细分析后不难发现,RankCP可疑度为“局部可疑度”,因为它仅仅衡量了相邻节点之间的条件概率。然而,某些程序bug,并不一定会造成相邻节点的执行异常。相反地,这些程序bug对程序执行过程的影响是全局的、累积的,并非突发的。针对这种情况,RankCP方法很难确定真正的bug位置。因此,如何计算“全局可疑度”来衡量程序执行的累积异常,成为程序错误诊断技术上的新思路本文档来自技高网...

【技术保护点】
一种基于贝叶斯网络推理的软件错误分层诊断方法,其特征在于,包括以下步骤:步骤1,以函数为代码元素,构建函数层贝叶斯网络程序依赖图,BNPDG是表示代码元素依赖关系的贝叶斯网络模型;函数层BNPDG表示为一个三元组(V,E,P);V代表节点集合,每个节点代表一个代码元素,即一个自定义函数;函数节点,有其对应的状态空间,不同状态值代表该代码元素不同的执行过程;E代表有向边的集合,每条有向边都代表代码元素之间的依赖关系,可以是语义依赖,包括控制依赖和数据依赖,也可以是通过测试数据得到的统计依赖;P代表网络参数,即每个节点的条件概率分布;构建函数层BNPDG包括以下子步骤,步骤1.1,将要测试的程序代码生成程序依赖图,确定函数层BNPDG语义依赖关系;步骤1.2,利用程序执行数据生成统计依赖关系图,确定函数层BNPDG统计依赖关系;步骤1.3,融合控制依赖边、数据依赖边和统计依赖边,形成基于贝叶斯网络的程序依赖图初始结构;步骤1.4,去掉基于贝叶斯网络的程序依赖图初始结构中的环路;步骤1.5,学习基于贝叶斯网络的程序依赖图中的参数信息;步骤2,在函数层贝叶斯网络程序依赖图上进行测试预言的概率推理,判断某个测试用例对整个程序来说是否为失败的测试用例;当确定某测试用例为失败测试用例以后,在函数层贝叶斯网络程序依赖图上进行错误定位的概率推理,计算代码元素的可疑度并排序,得到按照可疑度排序的函数序列;步骤3,按照函数的可疑度排序,以每一个函数内的语句为代码元素,构建对应函数的语句层贝叶斯网络程序依赖图;语句层BNPDG可以表示为一个三元组(V,E,P);V代表节点集合,每个节点代表一个代码元素,即一条程序语句;语句节点,有其对应的状态空间,不同状态值代表该代码元素不同的执行过程;E代表有向边的集合,每条有向边都代表代码元素之间的依赖关系,可以是语义依赖,包括控制依赖和数据依赖,也可以是通过测试数据得到的统计依赖;P代表网络参数,即每个节点的条件概率分布;构建语句层BNPDG包括以下子步骤,步骤3.1,将要测试的程序代码生成程序依赖图,确定语句层BNPDG语义依赖关系;步骤3.2,利用程序执行数据生成统计依赖关系图,确定语句层BNPDG统计依赖关系;步骤3.3,融合控制依赖边、数据依赖边和统计依赖边,形成基于贝叶斯网络的程序依赖图初始结构;步骤3.4,去掉基于贝叶斯网络的程序依赖图初始结构中的环路;步骤3.5,学习基于贝叶斯网络的程序依赖图中的参数信息;步骤4,按照函数的可疑度排序对函数进行逐一检查;检查某函数时,在该函数的语句层BNPDG上进行测试预言的概率推理,找到bug函数;在该bug函数的语句层贝叶斯网络程序依赖图上进行错误定位的概率推理,得到函数中所有语句的可疑度排序;按照语句的可疑度排序对语句进行逐一检查,直到找到真正的bug语句。...

【技术特征摘要】
1.一种基于贝叶斯网络推理的软件错误分层诊断方法,其特征在于,包括以下步骤:步骤1,以函数为代码元素,构建函数层贝叶斯网络程序依赖图,BNPDG是表示代码元素依赖关系的贝叶斯网络模型;函数层BNPDG表示为一个三元组(V,E,P);V代表节点集合,每个节点代表一个代码元素,即一个自定义函数;函数节点,有其对应的状态空间,不同状态值代表该代码元素不同的执行过程;E代表有向边的集合,每条有向边都代表代码元素之间的依赖关系,可以是语义依赖,包括控制依赖和数据依赖,也可以是通过测试数据得到的统计依赖;P代表网络参数,即每个节点的条件概率分布;构建函数层BNPDG包括以下子步骤,步骤1.1,将要测试的程序代码生成程序依赖图,确定函数层BNPDG语义依赖关系;步骤1.2,利用程序执行数据生成统计依赖关系图,确定函数层BNPDG统计依赖关系;步骤1.3,融合控制依赖边、数据依赖边和统计依赖边,形成基于贝叶斯网络的程序依赖图初始结构;步骤1.4,去掉基于贝叶斯网络的程序依赖图初始结构中的环路;步骤1.5,学习基于贝叶斯网络的程序依赖图中的参数信息;步骤2,在函数层贝叶斯网络程序依赖图上进行测试预言的概率推理,判断某个测试用例对整个程序来说是否为失败的测试用例;当确定某测试用例为失败测试用例以后,在函数层贝叶斯网络程序依赖图上进行错误定位的概率推理,计算代码元素的可疑度并排序,得到按照可疑度排序的函数序列;步骤3,按照函数的可疑度排序,以每一个函数内的语句为代码元素,构建对应函数的语句层贝叶斯网络程序依赖图;语句层BNPDG可以表示为一个三元组(V,E,P);V代表节点集合,每个节点代表一个代码元素,即一条程序语句;语句节点,有其对应的状态空间,不同状态值代表该代码元素不同的执行过程;E代表有向边的集合,每条有向边都代表代码元素之间的依赖关系,可以是语义依赖,包括控制依赖和数据依赖,也可以是通过测试数据得到的统计依赖;P代表网络参数,即每个节点的条件概率分布;构建语句层BNPDG包括以下子步骤,步骤3.1,将要测试的程序代码生成程序依赖图,确定语句层BNPDG语义依赖关系;步骤3.2,利用程序执行数据生成统计依赖关系图,确定语句层BNPDG统计依赖关系;步骤3.3,融合控制依赖边、数据依赖边和统计依赖边,形成基于贝叶斯网络的程序依赖图初始结构;步骤3.4,去掉基于贝叶斯网络的程序依赖图初始结构中的环路;步骤3.5,学习基于贝叶斯网络的程序依赖图中的参数信息;步骤4,按照函数的可疑度排序对函数进行逐一检查;检查某函数时,在该函数的语句层BNPDG上进行测试预言的概率推理,找到bug函数;在该bug函数的语句层贝叶斯网络程序依赖图上进行错误定位的概率推理,得到函数中所有语句的可疑度排序;按照语句的可疑度排序对语句进行逐一检查,直到找到真正的bug语句。2.根据权利要求1所述的一种基于贝叶斯网络推理的软件错误分层诊断方法,其特征在于,所述步骤1.2具体包括:每个节点对都计算一个统计因子,该统计因子用于衡量该节点对中两个节点之间是否存在依赖关系或者存在依赖关系的可能性大小,然后对得到的依赖关系进行剪枝,目的是去掉依赖关系中的间接依赖关系,最后,根据条件独立性测试确定依赖关系的方向,选择最大信息系数作为统计因子,所有的统计因子都可以通过调用MINE工具箱计算得到。3.根据权利要求1所述的一种基于贝叶斯网络推理的软件错误分层诊断方法,其特征在于,所述步骤1.5具体包括:基于Laplace平滑原理,在贝叶斯估计时设置先验参数,然后调整先验参数,改进平滑公式;贝叶斯估计先假设待估参数满足某一先验分布,然后用当前训练样本修改先验分布,得到参数的后验分布;具体是:改进的平滑策略学习BNPDG的条件概率参数,在先验参数α=(α1,α2,…,αn)的指定问题上充分考虑程序执行样本的特点;首先,结合代码元素状态分析与最大熵原理,确定va节点各个状态对应干预样本的占比;然后,根据干预样本与当前样本的比例,确定干预样本的条数;结合条件概率参数的计算公式,改进后的BNPDG的参数学习方案为:其中,an=⊥,4.根据权利要求1所述的一种基于贝叶斯网络推理的软件错误分层诊断方法,其特征在于,所述步骤2具体包括:步骤2.1,定义BNPDG中的节点,根据其语义依赖关系分成三类:输入节点、输出节点和逻辑节点;输入节点代表程序的输入环境,定义为不控制或数据依赖于其它任何节点的节点;输出节点代表程序的输出结果,定义为没有任何节点控制或数据依赖于它的节点;逻辑节点代表整个程序的逻辑处理过程,定义为BNPDG中除了输入、输出节点以外的其它节点;步骤2.2,测试预言的概率推理,判断失败测试用例;令BNPDG中的输入节点集合为在测试用例T的执行过程中它们的联合状态为输入节点的联合状态代表了程序的输入环境;令BNPDG的输出节点集合为在测试用例T的执行过程中它们的联合状态为输出节点的联合状态代表了程序的输出结果;利用给定输入节点状态后输出节点的条件概率Pro=P(ON=OS|IN=IS)表示该测试用例为成功测试用例的概率;假设该测试用例为失败的测试用例,将不会满足大部分测试用例的执行规律,Pro值就会较小;反之,Pro值就会较大;针对每个具体测试用例,为判断其为成功或者失败的测试用例,我们设置阈值ξTO,当Pro大于或者等于阈值ξTO时,判断其为成功的测试用例,否则,为失败的测试用例;针对不同程序应选择不同的阈值;选择方法:假设拥有待诊断程序P的n个测试用例;测试预言的任务是找出失败的测试用例;针对每个测试用例,都可在BNPDG上进行概率推理,计算出一个Pro值,n个测试用例对应n个Pro值;对所有的Pro值按从小到大进行排序,得到Pro值的顺序列表为Pro_Sorted=[Pro1,Pro2,…,Pron];计算每相邻两个Pro值对之间的差值ΔProi=Proi+1-Proi,i=1,2,…,n-1;找出最大的差值ΔPromax=max{ΔPro1,ΔPro2,…,ΔPron-1...

【专利技术属性】
技术研发人员:余啸刘进殷晓飞崔晓辉施泽洋井溢洋
申请(专利权)人:武汉大学
类型:发明
国别省市:湖北,42

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

1