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

一种基于约束求解的原子集合序列化违背探测方法 

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

申请日:2018-09-26

公开(公告)日:2019-03-26

公开(公告)号:CN109522207A

主分类号:G06F11/36(2006.01)I

分类号:G06F11/36(2006.01)I

优先权:

专利状态码:有效-授权

法律状态:2021.09.28#授权;2019.04.19#实质审查的生效;2019.03.26#公开

摘要:本发明公开了一种基于约束求解的原子集合序列化违背探测方法,属于软件测试技术领域。该方法包括如下步骤:首先动态收集并发程序原始执行轨迹,然后结合原子集合序列化违背的九种错误模式,建立原始执行轨迹中相关事件之间执行先后顺序的约束关系,将原子集合序列化违背的探测问题转化为约束求解问题,并利用Z3求解器进行约束求解,当约束有解时,该解对应的可执行交织中存在原子集合序列化违背错误,否则不存在。本发明扩大了原始执行轨迹中事件的交织空间,同时保证了由约束求解所生成的交织是可行的,由此降低了原子集合序列化违背探测的漏报率和误报率,提高了原子集合序列化违背探测能力。

主权项:1.一种基于约束求解的原子集合序列化违背探测方法,其特征在于,包括以下步骤:步骤1获得待测并发程序的一条真实执行轨迹;步骤2利用步骤1获得的真实执行轨迹,分析确定工作单元和原子集合,并利用工作单元和原子集合中的事件组成原子集合序列化违背的各种错误模式,收集潜在的可能会引起不可序列化交织的事件序列;步骤3:建立原子集合序列化违背约束;步骤4原子集合序列化违背约束求解。

全文数据:一种基于约束求解的原子集合序列化违背探测方法技术领域本发明涉及一种基于约束求解的原子集合序列化违背探测方法,属于软件测试技术领域。背景技术多核处理器的快速发展以及高级编程语言对并发编程的支持使得并发程序的开发和使用日益广泛。但由于并发程序执行的不确定性,使得并发错误难以理解、调试、重演和修复。原子违背是一种常见的并发程序错误,约占非死锁类型并发错误的65%。目前,原子违背探测技术,大多只针对单变量的原子违背,涉及多个共享变量的原子违背即原子集合序列化违背探测方法较少。研究表明,约13的原子违背错误是由于对多个共享变量的并发访问所引起的。现有的原子集合序列化违背探测技术大致分为三类:静态探测技术、运行时监测技术和运行时预测技术。静态探测技术从程序源码级别进行原子集合序列化违背的探测,由于缺少程序的动态执行信息,该方法误检率较高。运行时监测技术在程序执行过程中探测在程序实际执行序列中暴露出的原子集合序列化违背,该方法误检率低,但该方法因仅考虑单个执行轨迹,漏报率较高。运行时预测技术首先记录并发程序的一个动态执行轨迹,然后在特定约束条件下静态地生成该执行轨迹的其他交织,以暴露出在原执行轨迹中未发现的并发错误,与运行时监测技术相比,该方法具有较低的漏报率。现有运行时预测技术大多采用了较保守的并发程序模型,探测结果具有较高的误报率,或搜索的交织空间较有限,探测结果具有较高的漏报率。若某并发程序执行轨迹至少满足先发生于Happen-Before和锁保护两个约束,则称其为可行的执行轨迹。其中,Happen-Before关系约束,包含以下三个方面:1若事件ei,ej属于同一线程,且ei发生在ej之前,那么在任何情况下ei都必须在ej之前执行;2若事件ei激活了ej所在的线程,那么ei必须在ej前发生;3若事件ej等待来在ei发送的信息,那么ei必须在ej前发生;锁约束:每一个锁对acquire-release事件对都不能与操作同一锁变量的其他锁对产生交织,即在任何情况下任何一个锁只能被一个线程拥有,以此保证锁对象的互斥访问。对多个共享变量进行访问的原子集合序列化违背所有错误模式共9种,如表1所示,其中u,u’表示不同的工作单元,其中两个工作单元位于不同线程,x,y为两个不同地址的共享变量,且x与y之间存在一致性关系,即为同一原子集合中的变量。W表示写事件,R表示读事件。表1原子集合序列化违背的9种模式序号交织序列问题1Wux-Wu’x-Wu’y-Wuyu中x写的值丢失,u’中y写的值丢失2Wux-Wu’y-Wu’x-Wuyu中x写的值丢失,u’中y写的值丢失3Wux-Wu’y-Wux-Wu’xu中x写的值丢失,u’中y写的值丢失4Wux-Ru’x-Ru’y-Wuyu’中读到的x和y的值不一致5Wux-Ru’y-Ru’x-Wuyu’中读到的x和y的值不一致6Wux-Ru’y-Wuy-Ru’xu中读到的x和y的值不一致7Rux-Wu’y-Wu’x-Ruyu中读到的x和y的值不一致8Rux-Wu’y-Ruy-Wu’xu中读到的x和y的值不一致9Rux-Wu’x-Wu’y-Ruyu’中读到的x和y的值不一致发明内容针对现有技术的不足,本发明提出一种基于约束求解的原子集合序列化违背探测方法,将原子集合序列化违背的探测问题转化为约束求解问题,可有效降低原子集合序列化违背探测的误检率,提高其探测能力。本发明为解决其技术问题采用如下技术方案:一种基于约束求解的原子集合序列化违背探测方法,包括以下步骤:步骤1获得待测并发程序的一条真实执行轨迹;步骤2利用步骤1获得的真实执行轨迹,分析确定工作单元和原子集合,并利用工作单元和原子集合中的事件组成原子集合序列化违背的各种错误模式,收集潜在的可能会引起不可序列化交织的事件序列;步骤3:建立原子集合序列化违背约束;步骤4原子集合序列化违背约束求解。步骤1的具体过程如下:步骤11对待测程序进行插桩;步骤12执行插桩后的待测程序,得到一条真实的执行轨迹,一条执行轨迹是一个事件序列,表示为δ=,其中第i个事件ei,1≤i≤n包含下列属性:ti:表示事件ei所属的线程;mi:表示事件ei所访问的内存位置;li:表示当事件ei执行时,当前线程所拥有的锁集;ai:表示事件ei的事件类型,包括读、写、分支、获取锁、释放锁,等待、通知、创建线程和等待线程结束,进入方法和退出方法。步骤2的具体过程如下:步骤21确定工作单元:将一个Java类中的每个方法体都看作一个工作单元,对含有嵌套结构的方法,仅考虑最外层方法为一个工作单元;步骤22确定原子集合:通过静态分析方法对工作单元中的变量进行分析,若两个变量在所有工作单元中同时出现的概率大于某一阈值时,则认为这两个变量构成原子集合;步骤23给定a,b,c,d四个事件,其中a和c属于某工作单元,b和d属于另一工作单元,a和c位于同一线程,b和d位于同一线程,a和b位于不同线程上,a与c事件访问的不同共享变量是属于步骤22得到的原子集合,b与a以及c与d访问相同内存地址,且这四个事件的读写类型符合某个原子集合序列化违背模式中对应的事件读写类型,则a,b,c,d是一个潜在的可能会引起不可序列化交织的事件序列;收集这些潜在的可能会引起不可序列化交织的事件序列,对这些收集的事件序列,需要进一步探测是否存在可行的执行轨迹使这些事件序列中的四个事件的执行顺序符合某个不可序列化交织模式。步骤3的具体过程如下:对步骤23中得到的潜在原子集合序列化违背的事件序列建立原子集合序列化违背约束,其中a,b,c,d是某个事件序列中的四个事件,约束内容分为两部分:第一部分,事件a,b,c,d必须满足指定错误模式的交织顺序约束;第二部分,事件a,b,c,d在求解出的执行轨迹中一定会被执行,但不要求事件a,b,c,d读写的值与原执行轨迹中的对应的事件a,b,c,d读写的值相同。步骤4的具体过程如下:使用Z3约束求解器进行约束求解,当约束有解时,该解对应的新执行轨迹中存在原子集合序列化违背现象,否则不存在。本发明的有益效果如下:对原始程序执行轨迹和每个可能导致原子集合序列化违背的不可序列化事件的交织建立一组约束,将原子集合序列化违背探测问题转化为约束求解问题,可以提高原子集合序列化违背的探测精度;本方法属于运行时预测技术,可根据约束求解出隐藏在原始执行轨迹中没有暴露出的原子集合序列化违背错误,具有更强的探测能力。附图说明图1为本发明方法的实施流程图。具体实施方式下面结合附图对本发明创造做进一步详细说明。图1给出了本发明方法的实施流程图,基于该流程图开发的原子集合序列化违背探测工具,主要包括三个模块:被测程序插桩模块、执行轨迹收集模块、原子集合序列化违背探测模块。在原子集合序列化违背的探测过程中,首先将被测并发程序P作为输入,执行被测程序插桩模块,该模块在执行过程中利用静态逃逸分析技术识别出被测程序中的共享变量并存储,然后扫描被测程序源码中的每条语句,根据该语句的访问类型在该语句之前或之后添加log语句以实现在程序执行过程中收集执行轨迹的目的。然后利用执行轨迹收集模块执行插桩后的被测程序,被测程序执行过程中会执行插桩的log语句,收集程序执行过程中的信息,并将每个log语句收集的信息记录成事件存储在数据库中。当执行轨迹收集模块执行结束后,数据库中存储着各种类型的事件,这些事件构成的序列即为执行轨迹,执行轨迹中的事件序列按照其在被测程序执行的先后顺序排列。原子集合序列化违背探测模块以执行轨迹、共享变量集合作为输入,遍历执行轨迹中的事件序列,按照事件所在的线程将事件加入不同的集合中。根据算法计算原子集合和每个线程的工作单元,遍历每个线程的工作单元,并扫描其他线程的读、写事件,检查是否存在四个事件构成潜在的不可序列化交织模式。对每个不可序列化交织模式都建立相应的约束进行求解,判断该交织是否是个真实的原子集合序列化违背。本发明利用图1所示原子集合序列化违背工具,首先收集待测并发程序一次真实执行的轨迹,然后结合原子集合序列化违背的各种错误模式,建立原执行轨迹中事件之间执行先后顺序的约束关系,并进行求解,当约束有解时,表示该解对应的新执行轨迹中存在原子集合序列化违背现象,否则不存在,具体而言,包括以下步骤:1.获取待测并发程序的一条真实执行轨迹1对待测程序进行插桩,以便在运行时记录执行轨迹中的所需事件信息;顺序扫描待测程序中的每条语句,在特定的语句前后插桩代码,如:同步语句、赋值语句、分支语句、方法进出语句等,在实际执行时收集与这些语句相关的上下文信息,比如执行当前语句的线程信息、该语句访问的实际内存地址等,以组合成事件并将收集到的执行轨迹保存到数据库中;2执行插桩后的待测程序,得到一个真实的执行轨迹,执行轨迹是一个事件序列,表示为δ=,其中每个事件ei包含下列属性:ti:表示事件ei所属的线程;mi:表示事件ei所访问的内存位置;li:表示当事件ei执行时,当前线程所拥有的锁集;ai:表示事件ei的事件类型,包括读,写,获取锁,释放锁,等待,通知,创建线程和等待线程结束,进入方法,退出方法10种类型。2.利用上述执行轨迹分析确定工作单元和原子集合,并利用工作单元和原子集合中的事件组成原子集合序列化违背的各种错误模式,收集潜在的可能会引起不可序列化交织的事件序列1工作单元确定工作单元是访问原子集合中变量的代码区域,本发明将一个Java类中的每个方法体都看作一个工作单元,针对含有嵌套结构的方法,仅考虑最外层方法为一个工作单元。执行轨迹中包含进入和退出某个方法的事件,即enterMethod进入方法和exitMethod退出方法事件,通过分析执行轨迹中得到的每个线程访问的对序列,定位enterMethod事件和ExitMethod事件在轨迹中所处的位置,将这两个事件作为工作单元的边界,并将每对之间的同一线程的所有事件序列看作一个工作单元。本发明考虑工作单元时,仅考虑最外层方法,因此使用栈匹配策略防止与被嵌套方法的对发生混淆。2确定原子集合属于同一原子集合中的共享变量之间存在一致性关系,一般将在同一工作单元中同时被访问或者更新,通过静态分析方法对工作单元的变量进行分析,若两个变量在所有工作单元中同时出现的概率大于某一阈值时,则认为这两个变量可以构成原子集合。针对1中确定的执行轨迹中的每个工作单元,分析其中的所有共享变量,并且将其进行两两组合,生成候选原子集合。如果该原子集合在所有工作单元出现的频率在所有工作单元中占有的比重大于某一阈值,那么这个原子集合是真正的原子集合。本发明通过手工分析确定得到的相关变量是否存在真实的相关性,并且分析是否存在漏报的相关变量以确定最后的阈值选取。从阈值为1开始选择,若某阈值条件下,既不存在错误的相关变量也不存在漏报的相关变量,则停止阈值的迭代,选取当前阈值为最终阈值,否则当前阈值减少0.05,并且继续迭代。3给定a,b,c,d四个事件,其中a和c位于同一工作单元上,b和d位于同一工作单元上,a和c位于同一线程,b和d位于同一线程,a和b位于不同线程,a与c事件访问的不同共享变量属于同一原子集合,b与a以及c与d访问相同内存地址,且这四个事件的读写类型符合表1中某个原子集合序列化违背错误模式中对应的事件读写类型,则事件a,b,c,d是一个潜在的可能会引起不可序列化交织的事件序列;收集这些潜在的可能会引起不可序列化交织的事件序列,并进一步探测是否存在可行的执行轨迹使这些事件序列中的四个事件的执行顺序符合不可序列化交织模式。对每组由四个事件a,b,c,d组成的可能会引起不可序列化交织的事件序列进行预检查,判断此事件序列是否满足构成原子集合序列化违背的前提条件,预检查的内容包括:检查这四个事件是否被同一把锁保护,事件d和事件a或者事件b和事件c之间是否存在happened-before关系;若满足这两个条件的任意一条则表明这四个事件将不会构成一个真正的原子集合序列化违背,因此无需对此事件序列建立约束。通过预检查,可大大减少需建立的约束数目。3.约束的建立与求解,验证步骤2得到的潜在可能会引起不可序列化交织的事件序列是否是真正的原子集合序列化违背;对步骤1中得到的执行轨迹和步骤23中得到的事件序列建立约束并求解,需建立的约束等式有:happened-before约束、锁互斥约束、原子集合序列化违背约束,从而将原子集合序列化违背的探测问题转化为约束求解问题。1建立原子集合序列化违背约束对步骤2中得到的潜在原子集合序列化违背的事件序列建立原子集合序列化违背约束,其中a,b,c,d是某个事件序列中的四个事件,约束内容分为原子集合序列化违背错误模式以及事件序列可行性两部分,即a事件a,b,c,d满足表1中某个错误模式的交织顺序约束;b事件a,b,c,d在执行轨迹中一定会被执行,但不要求事件a,b,c,d读写的值与原执行轨迹中的事件a,b,c,d读写的值相同。影响事件的可行性的因素只包括三方面的约束:当前事件的happened-before约束、锁互斥约束、所有必须发生在当前事件的分支branch事件约束;happened-before约束和锁互斥约束前已述及,branch事件约束是指branch事件的可行性,如果branch事件不可行性,将导致程序执行不同的分支,从而使得当前事件在求解出的执行轨迹中实际得不到执行。为满足branch事件的可行性,每个读写事件e只需考虑每个线程距该事件e最近,并且发生在e之前的所有branch事件的可行性。其中每个branch事件的可行性又依赖于同一线程且发生在该branch事件之前的所有读read事件,如果这些read事件读到的值与原可行轨迹中的值相等,那么当前branch事件一定可行。但是这种约束方式过于严格,将导致引入一些不必要的约束,影响探测方法的探测能力和探测效率。在程序实际执行时,branch事件读取的共享变量的值只与同一线程内、发生在branch事件之前、距离branch事件最近且读取同一共享变量的几个read事件的值相关。因此为了保证branch事件的可行性,只需要保证这些read事件可行即可,而无需对所有同一线程内的read事件建立约束。这样可以减少针对分支事件可行性建立约束的个数,从而可以有效减少约束求解的事件,提高探测方法效率;并且由于不对某些非重要的read建立约束,也可以有效增加交织空间,提高探测方法的探测能力。2约束求解在本发明中我们借助Z3约束求解器对约束进行求解,根据生成的所有约束组合调用求解器进行求解,观察对步骤2中得到的事件序列建立的约束组合是否可以求得有效解。若有解,则说明存在可行的执行轨迹可以按照这种不可序列化交错序列的执行顺序来执行事件序列中的四个事件,即该潜在的将导致不可序列化交织的事件序列是一个真实的原子集合序列化违背。

权利要求:1.一种基于约束求解的原子集合序列化违背探测方法,其特征在于,包括以下步骤:步骤1获得待测并发程序的一条真实执行轨迹;步骤2利用步骤1获得的真实执行轨迹,分析确定工作单元和原子集合,并利用工作单元和原子集合中的事件组成原子集合序列化违背的各种错误模式,收集潜在的可能会引起不可序列化交织的事件序列;步骤3:建立原子集合序列化违背约束;步骤4原子集合序列化违背约束求解。2.根据权利要求1所述的一种基于约束求解的原子集合序列化违背探测方法,其特征在于,步骤1的具体过程如下:步骤11对待测程序进行插桩;步骤12执行插桩后的待测程序,得到一条真实的执行轨迹,一条执行轨迹是一个事件序列,表示为δ=,其中第i个事件ei,1≤i≤n包含下列属性:ti:表示事件ei所属的线程;mi:表示事件ei所访问的内存位置;li:表示当事件ei执行时,当前线程所拥有的锁集;ai:表示事件ei的事件类型,包括读、写、分支、获取锁、释放锁,等待、通知、创建线程和等待线程结束,进入方法和退出方法。3.根据权利要求1所述的一种基于约束求解的原子集合序列化违背探测方法,其特征在于,步骤2的具体过程如下:步骤21确定工作单元:将一个Java类中的每个方法体都看作一个工作单元,对含有嵌套结构的方法,仅考虑最外层方法为一个工作单元;步骤22确定原子集合:通过静态分析方法对工作单元中的变量进行分析,若两个变量在所有工作单元中同时出现的概率大于某一阈值时,则认为这两个变量构成原子集合;步骤23给定a,b,c,d四个事件,其中a和c属于某工作单元,b和d属于另一工作单元,a和c位于同一线程,b和d位于同一线程,a和b位于不同线程上,a与c事件访问的不同共享变量是属于步骤22得到的原子集合,b与a以及c与d访问相同内存地址,且这四个事件的读写类型符合某个原子集合序列化违背模式中对应的事件读写类型,则a,b,c,d是一个潜在的可能会引起不可序列化交织的事件序列;收集这些潜在的可能会引起不可序列化交织的事件序列,对这些收集的事件序列,需要进一步探测是否存在可行的执行轨迹使这些事件序列中的四个事件的执行顺序符合某个不可序列化交织模式。4.根据权利要求3所述的一种基于约束求解的原子集合序列化违背探测方法,其特征在于,步骤3的具体过程如下:对步骤23中得到的潜在原子集合序列化违背的事件序列建立原子集合序列化违背约束,其中a,b,c,d是某个事件序列中的四个事件,约束内容分为两部分:第一部分,事件a,b,c,d必须满足指定错误模式的交织顺序约束;第二部分,事件a,b,c,d在求解出的执行轨迹中一定会被执行,但不要求事件a,b,c,d读写的值与原执行轨迹中的对应的事件a,b,c,d读写的值相同。5.根据权利要求1所述的一种基于约束求解的原子集合序列化违背探测方法,其特征在于,步骤4的具体过程如下:使用Z3约束求解器进行约束求解,当约束有解时,该解对应的新执行轨迹中存在原子集合序列化违背现象,否则不存在。

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

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