一种验证并发程序中违反原子性错误是否被正确修复的方法

文档序号:8223401阅读:157来源:国知局
一种验证并发程序中违反原子性错误是否被正确修复的方法
【技术领域】
[0001] 本发明属于软件工程中程序分析与验证技术领域,尤其是并发软件的分析与验证 领域;同时本发明亦属于软件工程中Bug修复验证领域。这些领域主要依托程序静态、动态 亦或动静态结合的程序分析技术,对软件的正确性、修复的正确性进行验证。
【背景技术】
[0002] 随着多核处理器的发展,并发程序,由于其高效性,广受青睐。但是,并发程序由于 其通过不同线程间的通信,尤其是共享内存通信来保证程序中不同线程间的一致性,很难 在编码过程中不产生Bug,原子性错误就是其中最主要的一类,约占所有并发错误的2/3。
[0003] 原子性错误有如下几个模式,如表1,其中eiS事件,t i,iv分别为其所对应的 线程、所存取的内存位置及其存取类型,这些模式的完整性已得到了理论性的证明。
[0004] 表1 :原子性错误的各种模式
【主权项】
1. 一种验证并发程序中违反原子性错误是否被正确修复的方法,其特征是利用原始程 序执行错误时的执行日志,结合原子性错误的各种模式构造新的、适合于修复后程序的执 行日志,并通过观察修复后的程序是否能够按照新的日志正确执行来判断原子性错误是否 被修复,包括W下步骤: 1) 利用原始程序的错误执行日志W及修复后的程序,构造与错误执行日志对应同时又 包含修复信息的执行轨迹,所述修复指同步化,所述修复信息指如何使用同步化来修复的 信息,一个执行轨迹是一个事件序列,表示为5 = <61〉,其中每个事件e;包含下列属性: ti;事件e,所属的线程; nii;事件e;所存取的内存位置; li;当事件e i执行时,其所拥有的锁; ai;事件e i的存取类型,包括读,写,获取锁,释放锁,等待,通知,创建线程和等待线程 结束8种类型; 2) 利用所得执行轨迹,W及原子性错误的不同模式,构造适合于修复后程序的新执行 轨迹: 21) 使用步骤1)所构造的执行轨迹,首先根据一个并发程序必须满足的约束,即 Happens-Before关系和锁约束构造一个有向无环图,该图中包含执行轨迹中的所有事件, 事件用图的结点表示,且仅包含Happens-Before关系和锁约束所要求的事件间顺序关系, 顺序关系用图的有向边表示; 22) 根据原子性错误的各种模式,在步骤1)所构造的执行轨迹中捜索相应的事件序 列; 23) 不断的向有向无环图中添加符合原子性错误模式的边,直到其不能满足 Happens-Before关系和锁约束,输出一个新构造的有向无环图,判断新构造的有向无环图 是否覆盖所有满足原子性错误的模式的边,如不能覆盖,则构造新的有向无环图来覆盖他 们,直到构造得到的所有有向无环图覆盖所有满足原子性错误模式的边; 24) 对于步骤23)中的每一个有向无环图,继续向其中加入有向无环图不包含但原始 执行轨迹包含的边,直到不能满足Happens-Before关系和锁约束,最终输出该图的一个拓 扑排序,即一个新执行轨迹; 3) 按照构造的新执行轨迹,执行修复后的程序,观察程序是否正常执行来判断原子性 错误是否被修复。
2. 根据权利要求1所述的一种验证并发程序中违反原子性错误是否被正确修复的方 法,其特征是步骤1)中,修复信息来自于用户,根据修复信息对程序进行插状,构造执行轨 迹时包括W下操作: 11) 对每一个存取线程间共享内存的指令,使用一个全局锁进行同步,并在其中记录该 指令所对应的执行时事件的各种信息,即执行轨迹; 12) 根据修复信息,使用条件判断语句让程序选择性的跳过用于修复错误所引入的指 令,使修复后的程序仍然能够按照的错误执行日志执行,从而记录与的错误执行日志相对 应的执行轨迹; 13) 虽然跳过用于修复错误所引入的锁指令,在执行程序构造执行轨迹时,仍然记录新 引入的锁,使得执行轨迹与原始的错误执行日志相对应,且包含修复信息。
3. 根据权利要求1所述的一种验证并发程序中违反原子性错误是否被正确修复的方 法,其特征是步骤3)中,根据程序的控制流图和所构造的新执行轨迹按照W下规则进行启 发式执行,设e。是控制流图中所指示的实际将要执行的事件,e t是新执行轨迹所指示的将 要执行的事件: a) 若e济e。不属于相同线程,则阻塞正在运行的线程,切换到e r所属线程; b) 若e。与e t是同一事件,那么正常执行,e t指向新执行轨迹中的下一事件,执行e。,同 时让e。指向e t指向的下一将要执行的事件; C)若e。与e,不是同一事件,但属于同一线程: cl)控制流图中存在e。到e t的路径,执行e。,不改变et; c2)控制流图中不存在e。到e t的路径,但e。存在于新执行轨迹中e t之后,那么不做任 何执行,e,指向新执行轨迹中下一事件; c3)控制流图中不存在e。到e t的路径,e。也不存在于新执行轨迹中e t之后,执行e。, 指向新执行轨迹中的下一事件。
4. 根据权利要求1所述的一种验证并发程序中违反原子性错误是否被正确修复的方 法,其特征是步骤23)中为了提高算法效率,采用W下3种无损优化方法W及2种有损优化 方法中的一种或多种,所述无损优化方法指不影响算法正确性的优化方法,有损优化方法 指会影响正确性的优化方法: 无损优化1 ;由于事件顺序关系的传递性,一条边实际蕴含了一组顺序关系,该些顺序 关系不再需要通过显式的向图中加入边,减少该些边从而减少所需覆盖的满足原子性错误 的模式的边; 无损优化2; -次向有向无环图中加入多条满足原子性错误的模式的边,测试其是否 满足有向无环图应该满足的约束,若不满足,则进行回滚,即将该些边去除,若满足则一条 一条的加入有向无环图; 无损优化3 ;算法并行化;在步骤23)开始时,同时开启多个线程,同时通过覆盖不同的 边构造不同的新执行轨迹来快速覆盖所有的满足原子性错误的模式的边; 有损优化1 ;从所需覆盖的满足原子性错误模式的边中,去除那些对应相同源码语句, 但不同事件的,满足原子性错误模式的边; 有损优化2 ;按照原子集预测法来预测原子集,W减少所需覆盖的满足多变量原子性 错误模式的边。
【专利摘要】一种验证并发程序中违反原子性错误是否被正确修复的方法,利用原始程序执行错误时的执行日志,结合原子性错误的各种模式构造新的、适合于修复后程序的执行日志,并通过观察修复后的程序是否能够按照新的日志正确执行来判断原子性错误是否被修复。用户在并发程序出错后,使用同步化方法修复原子性错误,本发明方法能够帮助用户在重复执行修复程序若干次后自动判断bug是否被正确修复。本发明方法不要求用户知道Bug的准确位置,符合用户检验错误是否被修复的习惯性方法。
【IPC分类】G06F11-36
【公开号】CN104536878
【申请号】CN201410709983
【发明人】徐宝文, 周骏贵, 时清凯, 陈振宇, 张驰, 濮力, 程秀才, 谢佩章, 王婧宇
【申请人】南京大学, 江苏苏测软件检测技术有限公司
【公开日】2015年4月22日
【申请日】2014年11月28日
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1