基于多线程程序约束构建的数据竞争检测与证据生成方法技术

技术编号:10489888 阅读:182 留言:0更新日期:2014-10-03 17:54
一种基于多线程程序约束构建的数据竞争检测与证据生成方法,根据多线程程序语义构建约束表达式,将数据竞争检测问题转化为约束求解问题,采用约束求解器检测可能存在的数据竞争,并生成触发数据竞争的程序执行路径,首先插桩被检测程序,执行此程序并得到执行路径;其次根据多线程程序执行语义将执行路径转化为无量词一阶逻辑表达式,此约束表达式涵盖所有可行的线程交织;然后根据发生数据竞争时语句间时序关系构建数据竞争候选集合,生成候选发生竞争的条件;最后遍历候选集合判定是否存在数据竞争,如有则生成对应的证据序列,本方法可找出一次执行中所有的数据竞争且不存在误报情况,对每一个数据竞争都生成一个展示了数据竞争触发过程的证据序列。

【技术实现步骤摘要】

本专利技术涉及可信软件及软件测试领域,特别涉及一种。
技术介绍
随着处理器多核化的普及,多线程技术已经成为软件编程中提高CPU利用率不可或缺的技术。然而,由于线程之间交织的不确定性,多线程程序执行过程中可能会出现一些难以预料的行为导致程序出错,例如对临界区没有做好同步工作而导致的数据竞争问题。数据竞争是两个不同的线程在没有同步保护的情况同时访问一个内存,并且至少有一个写操作。数据竞争不一定导致程序错误,因为有些程序员故意让程序有数据竞争以提高运行的效率,但是有调查表明5-24%的数据竞争会对程序产生坏影响。数据竞争很难以被发现,因为它们经常发生在一些低概率出现的交织序列中,在现实中往往需要花很多时间去定位,其引起的错误如同“corner error”,即使在软件发布时也未必能够完全清除它们。因此,数据竞争检测是多线程程序测试领域最受关注的研究点之一。 过去几十年中数据竞争检测已有大量研究,设计出很多杰出的自动化检测工具,主要分为静态与动态分析技术。静态方法通过静态检测程序所有的路径来推断程序中的所有数据竞争,可以检测出大部分数据竞争;但由于使用大量假设,静态分析方法会产生无效的数据竞争,导致误报率较高。动态方法通过监控一次执行中内存与同步信息以确定是否存在数据竞争,能够提供较高精度的检测结果;但是动态分析方法受到交织与路径的影响,往往要通过多次执行来提高覆盖率。本文将静态代码分析与程序执行过程监测相结合,以提高覆盖率且尽可能消除误报。 现有的动态检测技术主要分为三种:基于lockset、基于happens-before与二者结合的方法。I)基于1ckset的方法对线程交织不敏感,但是存在误报情况,即无效竞争。 2)基于happens-before的方法只检测某特定交织序列上的数据竞争,检测结果虽可靠,但敏感于线程交织。3)混合方法结合了两者的优点,并且试图减小各自的缺点,但也面临如不能够搜索出隐藏的错误、1ckset高误报引起的无效报警等问题。
技术实现思路
为了克服上述现有技术的缺点,本专利技术的目的在于提供一种,根据多线程程序语义构建约束表达式,将数据竞争检测问题转化为约束求解问题,采用约束求解器检测可能存在的数据竞争,并生成触发数据竞争的程序执行路径。 为了实现上述目的,本专利技术采用的技术方案是: —种,包括如下步骤: SI)在给定输入下,通过执行已插桩的待测程序以生成路径记录文件,且识别出执行路径中公有变量的访问点以便于约束构建; S2)根据程序执行语义将执行路径中状态转移、线程交织关系转化为无量词一阶逻辑表达式,构建蕴含了所有可能的交织序列的多线程程序执行路径约束模型F ; S3)将路径中所有线程上可能发生数据竞争的两点视为数据竞争候选,收集所有候选并构建数据竞争候选集合DRCS,同时根据数据竞争的定义构建每个候选的竞争发生条件P ; S4)针对每一个候选竞争发生条件P,利用约束求解器验证FAp是否有解; S5)如果有解,则表示此竞争条件会触发真实的数据竞争;如果无解,则表示此候选不会触发数据竞争; S6)当存在数据竞争时,输出该数据竞争的证据序列; S7)对于数据竞争候选集合DRCS,如果遍历结束,则输出所有结果;否则,继续遍历下一个竞争候选; S8)验证结束后,输出检测到的所有数据竞争以及对应的证据序列。 本专利技术进一步的改进在于:所述步骤SI)中插桩工作并非在源码或者二进制的层面上进行,而是在字节码的层面上完成,具体实施方法为:首先将待测多线程程序源码转化为中间字节码格式,即LLVM字节码;然后将具有监控功能的语句植入待测程序;最后将植入监控代码的字节码链接成可执行程序。 本专利技术进一步的改进在于:所述步骤S2)中多线程程序执行路径约束模型F蕴含了执行路径所有可能的交织序列,包括五种约束:路径表达式、内存模型约束、读写关系约束、偏序约束以及同步语义约束,定义分别如下: I)路径表达式:描述线程内部的定义-使用链,以及控制线程内部状态转换; 2)内存模型约束:表示程序中语句、变量之间的关系,采用顺序一致性的语义,顺序一致性规定CPU按照代码中语句的顺序来执行程序; 3)读写关系约束:定义线程间的定义-使用链,规定共享变量所读取到的值,必须来自初始值以及最近的写值; 4)偏序约束:定义线程之间创建线程与终止线程操作语句于被操作线程语句之间的时序关系; 5)同步语义约束:定义线程之间同步控制操作语句之间的时序关系; 其中,定义-使用链为:将每一个线程序列转化为SSA格式,对于每一个SSA格式的执行序列,除去共享访问点都是一个完整的定义-使用链。 本专利技术进一步的改进在于:所述步骤S2)中多线程程序执行路径约束模型F的构建方法包括以下操作: I)计算路径表达式,以控制线程内部状态转移; 2)计算内存模型约束,以线程内限制语句之间的关系; 3)计算读写关系约束,以建立线程间的定义-使用链; 4)计算同步语义约束,以定义线程间同步关系; 5)计算偏序约束,以描述线程创建与终止的语义; 最后,结合以上五种约束,构成约束模型F。 本专利技术进一步的改进在于:定义执行路径事件集-「I = {?\0 < i < Μ,其中k 为线程数量,Ti = Ie1, e2,…,en}作为线程i的执行序列,en表示Ti的第η个事件,0(en)表示事件en的顺序,η表示Ti的事件数量,则: 所述路径表达式的计算方法: 将每一个线程序列转化为SSA格式,类似于路径条件(Path Condit1n)的收集,直接将SSA格式序列转化为路径表达式; 所述内存模型约束的计算方法: 采用顺序一致性模型,所有操作完全按程序的顺序执行,线程内的事件顺序符合约束: 本文档来自技高网
...

【技术保护点】
一种基于多线程程序约束构建的数据竞争检测与证据生成方法,其特征在于,包括如下步骤:S1)在给定输入下,通过执行已插桩的待测程序以生成路径记录文件,且识别出执行路径中公有变量的访问点以便于约束构建;S2)根据程序执行语义将执行路径中状态转移、线程交织关系转化为无量词一阶逻辑表达式,构建蕴含了所有可能的交织序列的多线程程序执行路径约束模型F;S3)将路径中所有线程上可能发生数据竞争的两点视为数据竞争候选,收集所有候选并构建数据竞争候选集合DRCS,同时根据数据竞争的定义构建每个候选的竞争发生条件ρ;S4)针对每一个候选竞争发生条件ρ,利用约束求解器验证F∧ρ是否有解;S5)如果有解,则表示此竞争条件会触发真实的数据竞争;如果无解,则表示此候选不会触发数据竞争;S6)当存在数据竞争时,输出该数据竞争的证据序列;S7)对于数据竞争候选集合DRCS,如果遍历结束,则输出所有结果;否则,继续遍历下一个竞争候选;S8)验证结束后,输出检测到的所有数据竞争以及对应的证据序列。

【技术特征摘要】
1.一种基于多线程程序约束构建的数据竞争检测与证据生成方法,其特征在于,包括如下步骤: 51)在给定输入下,通过执行已插桩的待测程序以生成路径记录文件,且识别出执行路径中公有变量的访问点以便于约束构建; 52)根据程序执行语义将执行路径中状态转移、线程交织关系转化为无量词一阶逻辑表达式,构建蕴含了所有可能的交织序列的多线程程序执行路径约束模型F ; 53)将路径中所有线程上可能发生数据竞争的两点视为数据竞争候选,收集所有候选并构建数据竞争候选集合DRCS,同时根据数据竞争的定义构建每个候选的竞争发生条件P ; 54)针对每一个候选竞争发生条件P,利用约束求解器验证FΛ P是否有解; 55)如果有解,则表示此竞争条件会触发真实的数据竞争;如果无解,则表示此候选不会触发数据竞争; 56)当存在数据竞争时,输出该数据竞争的证据序列; 57)对于数据竞争候选集合DRCS,如果遍历结束,则输出所有结果;否则,继续遍历下一个竞争候选; 58)验证结束后,输出检测到的所有数据竞争以及对应的证据序列。2.根据权利要求1所述基于多线程程序约束构建的数据竞争检测与证据生成方法,其特征在于,所述步骤SI)中插桩工作并非在源码或者二进制的层面上进行,而是在字节码的层面上完成,具体实施方法为:首先将待测多线程程序源码转化为中间字节码格式,即LLVM字节码;然后将具有监控功能的语句植入待测程序;最后将植入监控代码的字节码链接成可执行程序。3.根据权利要求1所述基于多线程程序约束构建的数据竞争检测与证据生成方法,其特征在于,所述步骤S2)中多线程程序执行路径约束模型F蕴含了执行路径所有可能的交织序列,包括五种约束:路径表达式、内存模型约束、读写关系约束、偏序约束以及同步语义约束,定义分别如下: 1)路径表达式:描述线程内部的定义-使用链,以及控制线程内部状态转换; 2)内存模型约束:表示程序中语句、变量之间的关系,采用顺序一致性的语义,顺序一致性规定CPU按照代码中语句的顺序来执行程序; 3)读写关系约束:定义线程间的定义-使用链,规定共享变量所读取到的值,必须来自初始值以及最近的写值; 4)偏序约束:定义线程之间创建线程与终止线程操作语句于被操作线程语句之间的时序关系; 5)同步语义约束:定义线程之间同步控制操作语句之间的时序关系; 其中,定义-使用链为:将每一个线程序列转化为SSA格式,对于每一个SSA格式的执行序列,除去共享访问点都是一个完整的定义-使用链。4.根据权利要求3所述基于多线程程序约束构建的数据竞争检测与证据生成方法,其特征在于,所述步骤S2)中多线程程序执行路径约束模型F的构建方法包括以下操作: 1)计算路径表达式,以控制线程内部状态转移; 2)计算内存模型约束,以线程内限制语句之间的关系;3)计算读写关系约束,以建立线程间的定义-使用链; 4)计算同步语义约束,以定义线程间同步关系; 5)计算偏序约束,以描述线程创建与终止的语义; 最后,结合以上五种约束,构成约束模型F。5.根据权利要求4所述基于多线程程序约束构建的数据竞争检测与证据生成方法,其特征在于,定义执行路径事件集合Επ = |Τ(_|0 < ? < /ch其中k为线程数量,Ti = Ie1,e2,…,en}作为线程i的执行序列,en表示Ti的第η个事件,0(en)表示事件en的顺序,η表示Ti的事件数量,则: 所述路径表达式的计算方法: 将每一个线程序列转化为SSA格式,...

【专利技术属性】
技术研发人员:刘烃张晓东俞乐晨刘沛郑庆华
申请(专利权)人:西安交通大学
类型:发明
国别省市:陕西;61

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

1