首页 专利交易 科技果 科技人才 科技服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

一种基于约束求解的原子违背探测方法 

申请/专利权人:东南大学

申请日:2017-01-24

公开(公告)日:2020-03-31

公开(公告)号:CN106844215B

主分类号:G06F11/36(20060101)

分类号:G06F11/36(20060101)

优先权:

专利状态码:有效-授权

法律状态:2020.03.31#授权;2017.07.07#实质审查的生效;2017.06.13#公开

摘要:本发明提供一种基于约束求解的原子违背探测方法,利用并发程序的原始执行轨迹确定原子性区域,结合原子违背的各种错误模式,建立原始执行轨迹中事件之间执行先后顺序的约束关系,利用Z3求解器进行约束求解,将原子违背的探测问题转化为约束等式的求解问题。本方法属于运行时预测技术,可根据约束求解出隐藏在原始执行轨迹中没有暴露出的原子违背错误,具有更好的探测原子违背的能力;对原始程序轨迹和每个不可序列化的执行交织建立一组约束,将探测原子违背问题转化为约束的求解问题,能够提高原子违背探测的精度。

主权项:1.一种基于约束求解的原子违背探测方法,其特征是利用并发程序原始执行轨迹,结合五种原子违背错误模式,建立原始执行轨迹中事件之间执行先后顺序的约束关系,并求解,当约束有解时,该解对应的新的执行轨迹中存在原子违背现象,当约束无解时,则不存在原子违背现象,具体实施过程包括以下步骤:步骤1:记录原始执行轨迹:步骤11:对原始程序进行插桩,以便在运行时记录必需的执行轨迹信息;步骤12:执行原始程序,记录程序执行轨迹,一个执行轨迹是一个事件序列,表示为δ=e1,e2,…ei,…,en,其中每个事件ei包含下列属性:ti:事件ei所属的线程;mi:事件ei所存取的内存位置;li:当事件ei执行时,其所拥有的锁;ai:事件ei的存取类型,包括读、写、获取锁、释放锁、等待、通知、创建线程和等待线程结束八种类型;步骤2:由步骤1所得的原始执行轨迹和预定义的原子区域模式确定原子性区域,并利用原子区域和五种原子违背错误模式收集潜在的可能会引起不可序列化交织的事件序列:步骤21:由步骤1所得的执行轨迹和预定义的原子区域模式,确定原子性区域;将每个synchronized方法,synchronized代码块以及锁保护的代码块均视为原子区域;步骤22:给定a,b,c三个事件,其中threada=threadb≠threadc,若事件a,b属于步骤21所得的同一原子性区域,且这三个事件的读写类型符合某个原子违背模式中对应的事件读写类型,则包含事件a,b,c的执行序列是一个潜在的可能会引起不可序列化交织的事件序列;收集这些潜在的可能会引起不可序列化交织的事件序列,对这些收集的事件序列,进一步探测是否存在执行轨迹使这些事件序列中的三个事件的执行顺序符合不可序列化交织模式;步骤3:建立原子违背约束:对步骤22中得到的事件序列建立原子违背约束,其中a,b,c是某个事件序列中的三个事件,threada=threadb≠threadc,且事件a,b来自同一原子性区域,约束内容分为两部分:第一部分:在执行轨迹中事件c在事件a和事件b之间执行;第二部分:在求解出的执行轨迹中一定会被执行,但不要求事件a,b,c读写的值与原执行轨迹中的事件a,b,c读写的值一样;步骤4:原子违背约束求解;使用Z3约束求解器进行约束求解,当约束有解时,该解对应的新的执行轨迹中存在原子违背现象,否则不存在原子违背现象。

全文数据:一种基于约束求解的原子违背探测方法所属技术领域[0001]本发明涉及软件测试技术领域,具体涉及一种基于约束求解的原子违背探测方法。背景技术[0002]随着多核处理器的普及,并发编程技术得到了广泛的应用。由于并发程序的执行交织空间大、运行不确定,并发程序错误的测试、调试以及修复十分困难。其中,原子违背是其中最常见的并发错误,约占非死锁类型并发错误的65%。现有的原子违背探测技术大致分为三类:静态探测技术、运行时监测技术和运行时预测技术。其中,静态探测技术可在程序源代码级别识别出潜在的原子违背错误,但其无法处理锁以外的其他类型的同步原语,误检率高。运行时监测技术监测并发程序执行,探测在程序实际执行中暴露出的原子违背错误,其误检率低,但漏检率高。运行时预测技术通过对程序执行序列进行分析和处理,可探测出隐藏在程序执行序列中尚未暴露的原子违背。然而,现有很多运行时预测技术或者由于采用了保守的并发程序模型,其探测结果具有较高的误检率,或者由于搜索交织空间有限,具有较高的漏检率。[0003]若某执行轨迹至少满足Happened-Before和锁保护两个约束,则称其为合法轨迹。其中,Happened-Before关系约束,包含以下三个方面:[0004]•若事件ei,ej属于同一线程,且ei发生在ej之前,那么在任何情况下ei都在ej之前执行;[0005]•若事件开启了幻所在的线程,那么ei必须在幻前发生;[0006]•若事件幻等待来在ei发送的信息,那么ei在幻前发生;[0007]锁约束LockConstraint:每一个锁对acquire-release都不能与其他操作同一锁变量的锁对产生交织,即在任何情况下对于任何一个锁只能被一个线程拥有,以保证互斥访问。[0008]对同一共享变量进行访问的原子违背有如下五种模式,如表1,其中U表示线程,R1,分别表示线程U的读事件与写事件,m表示事件所存取的内存位置。[0009]表1:原子违背的各种模式发明内容[0011]针对现有技术的不足,本发明提出一种基于约束求解的原子违背探测方法,将原子违背的探测问题转化为约束等式的求解问题,可有效降低原子违背探测的误检率,提高其探测能力。[0012]为实现上述方面目的,本发明采用如下技术方案:[0013]—种基于约束求解的原子违背探测方法,利用并发程序原始执行轨迹,结合原子违背的各种错误模式,建立原始执行轨迹中事件之间执行先后顺序的约束关系,并求解,当约束有解时,该解对应的新的执行轨迹中存在原子违背现象,当约束无解时,则不存在原子违背现象。[0014]进一步的,包括以下步骤:[00Ί5]步骤1:记录原始执行轨迹:[0016]步骤11:对原始程序进行插粧,以便在运行时记录需要的执行轨迹信息;[0017]步骤12:执行原始程序,记录执行轨迹,一个执行轨迹是一个事件序列,表示为δ=〈ei,e2,…ei,…,en,其中每个事件ei包含下列属性:[0018]ti:事件ei所属的线程;[0019]nu:事件ei所存取的内存位置;[0020]I1:当事件ei执行时,其所拥有的锁;[0021]a1:事件ei的存取类型,包括读、写、获取锁、释放锁、等待、通知、创建线程和等待线程结束等八种类型;[0022]步骤2:由步骤1所得的原始执行轨迹和预定义的原子区域模式确定原子性区域,并利用原子区域和原子违背的各种错误模式收集潜在的可能会引起不可序列化交织的事件序列:[0023]步骤21:由步骤1所得的执行轨迹和预定义的原子区域模式,确定原子性区域;将每个synchronized方法,synchronized代码块以及锁保护的代码块均视为原子区域;[0024]步骤22:给定a,b,c三个事件,其中threada=threadb辛threadc,若事件a,b属于步骤21所得的同一原子性区域,且这三个事件的读写类型符合某个原子违背模式中对应的事件读写类型,则事件a,b,c是一个潜在的可能会引起不可序列化交织的事件序列;收集这些潜在的可能会引起不可序列化交织的事件序列,对这些收集的事件序列,进一步探测是否存在执行轨迹使这些事件序列中的三个事件的执行顺序符合不可序列化交织模式;[0025]步骤3:建立原子违背约束;[0026]对步骤22中得到的事件序列建立原子违背约束,其中(a,c,b是某个事件序列中的三个事件,其中threada=threadb辛threadc,且事件a,b来自同一原子性区域,约束内容分为两部分:[0027]第一部分:在求解出的执行轨迹中事件c要在事件a和事件b之间被执行;[0028]第二部分:事件a,b,c在求解出的执行轨迹中一定会被执行,但不要求事件a,b,c读写的值与原执行轨迹中的事件a,b,c读写的值一样;[0029]步骤4:原子违背约束求解[0030]使用Z3约束求解器进行约束求解,当约束有解时,该解对应的新的执行轨迹中存在原子违背现象,否则不存在。[0031]本发明的有益效果为:1、对原始程序轨迹和每个不可序列化的执行交织建立一组约束,将探测原子违背问题转化为约束的求解问题,提高原子违背探测的精度;[0032]2、本方法属于运行时预测技术,可根据约束求解出隐藏在原始执行轨迹中没有暴露出的原子违背错误,具有更好的探测原子违背的能力。附图说明[0033]图1为本发明方法的实施流程图。具体实施方式[0034]本发明利用并发程序原始执行轨迹,结合原子违背的各种错误模式,建立原始执行轨迹中事件之间执行先后顺序的约束关系,并求解,当约束有解时,该解对应的新的执行轨迹中存在原子违背现象,否则不存在,具体而言,包括以下步骤:[0035]1.得到执行轨迹:[0036]1对原始程序进行插粧,以便在运行时记录需要的轨迹执行信息;[0037]顺序扫描被测程序中的每条语句,在特定的语句前后插粧代码,如:同步语句、赋值语句、分支语句等,在实际执行时收集与这些语句相关的信息以组合成事件并保存到数据库中;[0038]2执行插粧后的原始并发程序,得到执行轨迹,一个执行轨迹是一个事件序列,表示为3=〈61,62,^,〃_,611,其中每个事件61包含下列属性:[0039]ti:事件ei所属的线程;[0040]HU:事件ei所存取的内存位置;[0041]I1:当事件ei执行时,其所拥有的锁;[0042]ai:事件ei的存取类型,包括读,写,获取锁,释放锁,等待,通知,创建线程和等待线程结束8种类型。[0043]2.利用所得执行轨迹和预定义的原子区域模式确定原子性区域,并利用原子区域和原子违背的各种错误模式收集潜在的可能会引起不可序列化交织的事件序列:[0044]1本发明中将每个synchronized方法,synchronized代码块以及锁保护的代码块均看做原子区域;[0045]执行轨迹中包含进入和退出synchronized方法,synchronized代码块和锁保护区域的acquire和release事件,通过分析执行轨迹得到每个线程访问每个锁变量的〈acquire,release〉对序列,对于每个〈acquire,release〉事件对,定位acquire和release事件在对应线程执行轨迹中的位置,并将acquire和release事件的位置作为原子区域边界;将每对原子区域边界之间的事件序列看作一个原子区域;[0046]2a,b,c三个事件,其中threada=threadb辛threadc,事件a,b属于步骤21所得的同一原子性区域,且这三个事件的读写类型符合某个原子违背模式中对应的事件读写类型,则事件a,b,c是一个潜在的可能会引起不可序列化交织的事件序列,收集这些潜在的可能会引起不可序列化交织的事件序列,对收集的这些事件序列,我们进行进一步探测是否存在执行轨迹能使得这些事件序列中的三个事件的执行顺序符合不可序列化交织模式;[0047]对每组由三个事件a,b,c组成的可能会引起不可序列化交织的事件序列进行快速检查,判断此事件序列是否满足构成原子违背的前提条件,快速检查的内容包括:检查事件c和事件a,b是否被同一把锁保护,事件c和事件a,b之间是否存在happened-before关系;若满足这两个条件的任意一条则表明事件c不会发生在事件a和b之间,即不会构成一个真正的原子违背,因此不需要对此事件序列建立约束。[0048]3.约束的建立与求解,验证步骤2得到的潜在的可能会引起不可序列化交织的事件序列是否是真正的原子违背;[0049]为验证步骤2得到的潜在的可能会引起不可序列化交织的事件序列是否是真正的原子违背,需求解是否存在执行轨迹能使所得事件序列中的三个事件的执行顺序符合不可序列化交织模式,对步骤1中得到的执行轨迹和步骤22中得到的事件序列建立约束并求解,需要建立的约束等式有:happened-before约束、锁互斥约束、原子违背约束,将原子违背的探测问题转化为约束等式的求解问题。[0050]1建立原子违背约束:[0051]对步骤2中得到的事件序列建立原子违背约束,其中(a,c,b是某个事件序列中的三个事件,其中threada=threadb辛threadc,且事件a,b来自同一原子性区域,约束内容主要分为两部分:[0052]11事件a,b,c执行的顺序约束,在原子违背模式中要求事件c在事件事件a和事件b之间被执行,因此c在事件a和事件b之间被执行是此事件序列构成原子违背的必要条件,因此在求解出的执行轨迹中事件c要在事件a和事件b之间被执行;[0053]12需要保证事件a,b,c在求解出的执行轨迹中一定会被执行,但不要求事件a,b,c读写的值与原执行轨迹中的事件a,b,c读写的值一样;[0054]由于不要求read和write事件读写特定的值,因此影响读写事件e的可行性因素除了Happened-before关系和锁一致性要求以外,还有一些必须发生在e之前的分支branch事件;若这些branch事件是不可行的,则事件e也是不可行的,S卩在事件e在求解出的执行轨迹中不会执行,因此需要保证这些branch事件的可行性;[0055]对每个读写事件e只需考虑每个线程距离事件e最近,且和e有偏序关系的branch事件的具体可行性,“具体”表示某事件在求解出的执行轨迹中所有属性的值都和原执行轨迹中对应的事件相等;branch事件的可行性依赖于在同一线程内在branch事件之前的所有read事件,即约束branch事件所依赖的read事件的值在求解出的执行轨迹中与原执行轨迹中相等;branch事件的可行性约束进而转化为对read事件可行性的约束,read事件的可行性约束要求read事件读取的值与原执行轨迹中在此read事件之前发生、距离此read事件最近且与此read事件操作同一共享变量的write事件的值相同;[0056]在对branch事件建立可行性约束时,若假定branch事件的可行性依赖于同一线程内部在branch事件之前所有的read事件,贝Ij会引入一些不必要的read事件的可行性约束;实际程序执行时,branch事件读取的共享变量的值来自同一线程内在branch事件之前且离branch事件最近,读同一共享共享变量的read事件的值;因此为确保branch事件读写共享变量的值不变,只需保证线程内在branch事件之前的所有read事件中,如果有多个read事件操作同一共享变量,则只需确保距离branch事件最近的read事件读的值不变,而不需要所有的read事件读的值不变;通过这种方法可以减少对于分支事件可行性建立约束的个数,从而减少约束求解的时间。[0057]2约束求解[0058]在本发明中我们借助约束求解器Z3实现约束的求解,将所有的约束组合并调用求解器求解方法,观察对步骤2中得到的事件序列建立的约束求解是否有解,若有解则说明存在执行轨迹可以按照这种不可序列化交错序列的顺序执行事件序列中的三个事件,即此潜在的可能会引起不可序列化交织的事件序列是一个真实的原子违背。[0059]以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

权利要求:1.一种基于约束求解的原子违背探测方法,其特征在于,利用并发程序原始执行轨迹,结合原子违背的各种错误模式,建立原始执行轨迹中事件之间执行先后顺序的约束关系,并求解,当约束有解时,该解对应的新的执行轨迹中存在原子违背现象,当约束无解时,则不存在原子违背现象。2.根据权利要求1所述的一种基于约束求解的原子违背探测方法,其特征在于,包括以下步骤:步骤1:记录原始执行轨迹:步骤11:对原始程序进行插粧,以便在运行时记录需要的执行轨迹信息;步骤12:执行原始程序,记录执行轨迹,一个执行轨迹是一个事件序列,表示为δ=,其中每个事件ei包含下列属性:tl:事件ei所属的线程;m1:事件ei所存取的内存位置;Ii:当事件ei执行时,其所拥有的锁;ai:事件ei的存取类型,包括读、写、获取锁、释放锁、等待、通知、创建线程和等待线程结束等八种类型;步骤2:由步骤1所得的原始执行轨迹和预定义的原子区域模式确定原子性区域,并利用原子区域和原子违背的各种错误模式收集潜在的可能会引起不可序列化交织的事件序列:步骤21:由步骤1所得的执行轨迹和预定义的原子区域模式,确定原子性区域;将每个synchronized方法,synchronized代码块以及锁保护的代码块均视为原子区域;步骤22:给定a,b,c三个事件,其中threada=threadb辛threadc,若事件a,b属于步骤21所得的同一原子性区域,且这三个事件的读写类型符合某个原子违背模式中对应的事件读写类型,则事件a,b,c是一个潜在的可能会引起不可序列化交织的事件序列;收集这些潜在的可能会引起不可序列化交织的事件序列,对这些收集的事件序列,进一步探测是否存在执行轨迹使这些事件序列中的三个事件的执行顺序符合不可序列化交织模式;步骤3:建立原子违背约束;对步骤22中得到的事件序列建立原子违背约束,其中(a,c,b是某个事件序列中的三个事件,其中threada=threadb辛threadc,且事件a,b来自同一原子性区域,约束内容分为两部分:第一部分:在求解出的执行轨迹中事件c要在事件a和事件b之间被执行;第二部分:事件a,b,c在求解出的执行轨迹中一定会被执行,但不要求事件a,b,c读写的值与原执行轨迹中的事件a,b,c读写的值一样;步骤4:原子违背约束求解;使用Z3约束求解器进行约束求解,当约束有解时,该解对应的新的执行轨迹中存在原子违背现象,否则不存在。

百度查询: 东南大学 一种基于约束求解的原子违背探测方法

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。