基于程序约束构建的多线程程序输出唯一性检测与证据生成方法

文档序号:6552468阅读:297来源:国知局
基于程序约束构建的多线程程序输出唯一性检测与证据生成方法
【专利摘要】一种基于程序约束构建的多线程程序输出唯一性检测与证据生成方法,根据多线程程序语义构建约束表达式,将输出唯一性验证问题转化为约束求解问题,采用约束求解器检测是否存在不同的输出,并生成说明不同输出的反例执行路径,首先,插桩被检测程序,执行此程序并得到执行路径;其次,根据多线程程序执行语义,将执行路径转化为无量词一阶逻辑表达式,此约束表达式涵盖所有可行的线程交织;然后,针对一次运行的输出结果,构建唯一性验证条件;最后,利用约束求解器验证是否存在一条路径使得输出值与运行结果不一致,本方法可以检测出在给定输入下,多线程程序的输出是否唯一;如果存在输出不唯一的情况,则展示出反例序列以说明其触发过程。
【专利说明】基于程序约束构建的多线程程序输出唯一性检测与证据生成方法

【技术领域】
[0001]本发明涉及可信软件及软件测试领域,特别涉及一种基于程序约束构建的多线程程序输出唯一性检测与证据生成方法。

【背景技术】
[0002]随着多核处理器被普遍应用,编写性能与结构良好的多线程程序成为释放多核处理器潜能的重要途径。调试多线程程序中的隐晦错误成为当务之急。对于串行程序,同一输入,多次执行下输出必定唯一。但是同一输入下对,于多线程程序的多次执行,未必就能产生唯一的输出。因为多线程程序在每次执行过程中都可能会产生不同的线程交织,对程序的执行结果也会有不同的影响。所以,如何验证多线程程序的输出唯一性,是一个亟待解决的问题。
[0003]然而,验证多线程程序存在一定的难度,难以重现并行错误。多线程程序具有以下几个特征:1)用户难以控制所有线程之间的执行顺序;2)在调试器中使用插装技术或者断点调试方法会产生副作用,导致某些错误消失;3)由于操作系统与运行时环境的原因,导致错误发生的序列很少再次发生;4)线程交织导致的空间状态爆炸,例如,对于有η个线程,每个线程执行k指令的程序,其交织序列数量可达(nk) ! /(k ! )n>=(n! )k。即使在可控制线程调度的假设下,程序员也无法用穷举所有线程交织。
[0004]目前,对于多线程程序的测试与验证已有大量工作,其中包括不确定性测试与模型检验等。基于覆盖标准指导的不确定测试方法,通过检查每次执行中的覆盖标准集合以确定尚未覆盖的元素,向程序中插入随机延迟以增大下次执行中覆盖其他元素的可能性。此外,模型检验通过符号化程序状态以及遍历整个状态空间,以查找程序中的错误状态。虽然模型检验在一定程度解决了多线程程序的验证问题,但其具有状态空间爆炸问题,导致难以扩展应用到大型复杂软件系统。


【发明内容】

[0005]为了克服上述现有技术的缺点,本发明的目的在于提供一种基于程序约束构建的多线程程序输出唯一性检测与证据生成方法,根据多线程程序语义构建约束表达式,将输出唯一性的验证问题转化为约束求解问题,采用约束求解器检测是否存在不同的输出,并生成说明不同输出的反例执行路径。
[0006]为了实现上述目的,本发明采用的技术方案是:
[0007]—种基于程序约束构建的多线程程序输出唯一性检测与证据生成方法,包括如下步骤:
[0008]SI)将监控代码植入待测程序,以记录程序的执行过程;
[0009]S2)在给定输入下,执行已插桩程序,生成路径记录文件;
[0010]S3)预处理执行路径以便于约束构建;[0011 ] S4)在程序运行结尾处自动添加属性条件,针对多线程程序的运行输出,将输出唯一性条件P以assert的格式插入程序;
[0012]S5)根据程序执行语义将执行路径中状态转移、线程交织关系转化为无量词一阶逻辑表达式,构建蕴含了所有可能的交织序列的多线程程序执行路径约束模型F ;
[0013]S6)针对唯一性条件P ,利用约束求解器验证Ρλ ~7?是否有解。
[0014]S7)如果有解,则表示存在多种不同的输出,并生成证据序列;如果无解,则表示此输出在此输入下唯一。
[0015]本发明进一步的改进在于:所述步骤SI)中插桩工作并非在源码或者二进制的层面上进行,而是在字节码的层面上完成,具体实施方法为:首先将待测多线程程序源码转化为中间字节码格式,即LLVM字节码;然后将具有监控功能的语句植入待测程序;最后将植入监控代码的字节码链接成可执行程序。
[0016]本发明进一步的改进在于:所述步骤S3)中预处理包括提取共享变量以识别出执行路径中公有变量的访问点以及切片以去除与验证属性无关的执行语句。
[0017]本发明进一步的改进在于:所述步骤S4)中自动识别出输出变量且对其构建输出唯一性验证条件P。
[0018]本发明进一步的改进在于:所述步骤S5)中多线程程序执行路径约束模型F蕴含了执行路径所有可能的交织序列,包括五种约束:路径表达式、内存模型约束、读写关系约束、偏序约束以及同步语义约束,定义分别如下:
[0019]I)路径表达式:描述线程内部的定义-使用链,以及控制线程内部状态转换;
[0020]2)内存模型约束:表示程序中语句、变量之间的关系,采用顺序一致性的语义,顺序一致性规定CPU按照代码中语句的顺序来执行程序;
[0021]3)读写关系约束:定义线程间的定义-使用链,规定共享变量所读取到的值,必须来自初始值以及最近的写值;
[0022]4)偏序约束:定义线程之间创建线程与终止线程操作语句于被操作线程语句之间的时序关系;
[0023]5)同步语义约束:定义线程之间同步控制操作语句之间的时序关系;
[0024]其中,定义-使用链为:将每一个线程序列转化为SSA格式,对于每一个SSA格式的执行序列,除去共享访问点都是一个完整的定义-使用链。
[0025]本发明进一步的改进在于:所述步骤S5)中多线程程序执行路径约束模型F的构建方法包括以下操作:
[0026]I)计算路径表达式,以控制线程内部状态转移;
[0027]2)计算内存模型约束,以线程内限制语句之间的关系;
[0028]3)计算读写关系约束,以建立线程间的定义-使用链;
[0029]4)计算同步语义约束,以定义线程间同步关系;
[0030]5)计算偏序约束,以描述线程创建与终止的语义;
[0031]最后,结合以上五种约束,构成约束模型F。
[0032]本发明进一步的改进在于:定义执行路径事件集合Ejr = {Ti\0 < i S Ic},其中k为线程数量,Ti = Ie1, e2,...,ej作为线程i的执行序列,en表示Ti的第η个事件,0(en)表示事件en的顺序,η表示Ti的事件数量,则:
[0033]所述路径表达式的计算方法:
[0034]将每一个线程序列转化为SSA格式,类似于路径条件(Path Condit1n)的收集,直接将SSA格式序列转化为路径表达式;
[0035]所述内存模型约束的计算方法:
[0036]采用顺序一致性模型,所有操作完全按程序的顺序执行,线程内的事件顺序符合约束:
[0037]

【权利要求】
1.一种基于程序约束构建的多线程程序输出唯一性检测与证据生成方法,其特征在于,包括如下步骤: 51)将监控代码植入待测程序,以记录程序的执行过程; 52)在给定输入下,执行已插桩程序,生成路径记录文件; 53)预处理执行路径以便于约束构建; 54)在程序运行结尾处自动添加属性条件,针对多线程程序的运行输出,将输出唯一性条件P以assert的格式插入程序; 55)根据程序执行语义将执行路径中状态转移、线程交织关系转化为无量词一阶逻辑表达式,构建蕴含了所有可能的交织序列的多线程程序执行路径约束模型F ; 56)针对唯一性条件P,利用约束求解器验illI / P是否有解。 57)如果有解,则表示存在多种不同的输出,并生成证据序列;如果无解,则表示此输出在此输入下唯一。
2.根据权利要求1所述基于程序约束构建的多线程程序输出唯一性检测与证据生成方法,其特征在于,所述步骤SI)中插桩工作并非在源码或者二进制的层面上进行,而是在字节码的层面上完成,具体实施方法为:首先将待测多线程程序源码转化为中间字节码格式,即LLVM字节码;然后将具有监控功能的语句植入待测程序;最后将植入监控代码的字节码链接成可执行程 序。
3.根据权利要求1所述基于程序约束构建的多线程程序输出唯一性检测与证据生成方法,其特征在于,所述步骤S3)中预处理包括提取共享变量以识别出执行路径中公有变量的访问点以及切片以去除与验证属性无关的执行语句。
4.根据权利要求1所述基于程序约束构建的多线程程序输出唯一性检测与证据生成方法,其特征在于,所述步骤S4)中自动识别出输出变量且对其构建输出唯一性验证条件P O
5.根据权利要求1所述基于程序约束构建的多线程程序输出唯一性检测与证据生成方法,其特征在于,所述步骤S5)中多线程程序执行路径约束模型F蕴含了执行路径所有可能的交织序列,包括五种约束:路径表达式、内存模型约束、读写关系约束、偏序约束以及同步语义约束,定义分别如下: 1)路径表达式:描述线程内部的定义-使用链,以及控制线程内部状态转换; 2)内存模型约束:表示程序中语句、变量之间的关系,采用顺序一致性的语义,顺序一致性规定CPU按照代码中语句的顺序来执行程序; 3)读写关系约束:定义线程间的定义-使用链,规定共享变量所读取到的值,必须来自初始值以及最近的写值; 4)偏序约束:定义线程之间创建线程与终止线程操作语句于被操作线程语句之间的时序关系; 5)同步语义约束:定义线程之间同步控制操作语句之间的时序关系; 其中,定义-使用链为:将每一个线程序列转化为SSA格式,对于每一个SSA格式的执行序列,除去共享访问点都是一个完整的定义-使用链。
6.根据权利要求5所述基于程序约束构建的多线程程序输出唯一性检测与证据生成方法,其特征在于,所述步骤S5)中多线程程序执行路径约束模型F的构建方法包括以下操作: 1)计算路径表达式,以控制线程内部状态转移; 2)计算内存模型约束,以线程内限制语句之间的关系; 3)计算读写关系约束,以建立线程间的定义-使用链; 4)计算同步语义约束,以定义线程间同步关系; 5)计算偏序约束,以描述线程创建与终止的语义; 最后,结合以上五种约束,构成约束模型F。
7.根据权利要求6所述基于多线程程序约束构建的输出唯一性验证方法,其特征在于,定义执行路径事件集合
,其中k为线程数量,Ti = Ie1, e2,...,en}作为线程i的执行序列,en表示Ti的第η个事件,0(en)表示事件en的顺序,η表示Ti的事件数量,则: 所述路径表达式的计算方法: 将每一个线程序列转化为SSA格式,直接将SSA格式序列转化为路径表达式; 所述内存模型约束的计算方法: 采用顺序一致性模型,所有操作完全按程序的顺序执行,线程内的事件顺序符合约束:
其中61与^+1表示同一线程内连续的两个事件,τ表示所有线程序列; 所述读写关系约束的计算方法: 使共享变量的读来自于最近的写,对于同一共享变量V,令R作为所有对其进行读操作的事件集合,令W作为所有对其进行写操作的事件集合,给出以下公式:
其中,er为读事件,ew与ex为写事件,vr和vw为事件^与ew所操作的变量,公式所表达的意思是,如果事件^中的 ' 取值来自于事件ew中的vw,首先要满足^在ew之后,即0(ew) <0(er);然后要满足所有的写要么在ew之前,要么在&之后; 所述同步语义约束的计算方法包括lock/unlock与wait/signal两类操作: 1)lock/unlock操作的目的为构建锁同步语义约束,要求在同一互斥锁的lock/unlock集合L中,对于任意两个lock/unlock事件对=IiAii与lk/uk,须满足公式:
其中,锁对IiAii要么发生在锁对lk/uk之前,要么发生在其后; 2)wait/signal操作的目的是构建条件变量同步语义约束,要满足条件:每一个wait操作必须对应一个signal操作,而一个signal操作至多唤醒一个wait操作,对于同一条件变量cond,令WT作为在cond上所有wait操作的集合,令SG作为在cond上所有signal操作的集合,如要满足之上的条件,须有以下公式:
其中,ewt为WT中的任一元素,SGwt表示ewt可以匹配的signal操作的集合,esg为SGlrt中任一 signal操作事件,利用变量Pairv^是否等于I来表示esg是否与ewt相匹配。子公式EeeSGwt Pa1-rWt -1表示,对于每一个wait操作ewt必须有一个signal操作与之匹配; 所述偏序约束的计算方法: 首先规定:如果事件创建一个线程,那么被创建线程的所有事件都要在此事件之后执行;如果事件执行线程终止操作,那么被终止线程的所有事件都要在此事件之前;令C为create/fork操作的事件集合,令J作为join操作的事件集合;给定约束:
其中,e。为线程创建事件,first (e。)为e。所创建的线程首个事件的顺序;&为线程终止事件;last(ep为&所结束的线程末尾事件的顺序; 最终将以上五种约束相与构成约束模型F。
8.根据权利要求1所述基于多线程程序约束构建的输出唯一性验证方法,其特征在于,所述步骤S6)中 给定约束模型与输出唯一性属性条件,利用约束求解器求解属性条件;如果存在不同的输出,则生成反例以说明此不同输出的触发过程。
【文档编号】G06F11/36GK104077226SQ201410320129
【公开日】2014年10月1日 申请日期:2014年7月7日 优先权日:2014年7月7日
【发明者】刘烃, 张晓东, 刘沛, 俞乐晨, 郑庆华 申请人:西安交通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1