CN110083538B - 一种并发程序噪声注入方法 - Google Patents
一种并发程序噪声注入方法 Download PDFInfo
- Publication number
- CN110083538B CN110083538B CN201910347672.2A CN201910347672A CN110083538B CN 110083538 B CN110083538 B CN 110083538B CN 201910347672 A CN201910347672 A CN 201910347672A CN 110083538 B CN110083538 B CN 110083538B
- Authority
- CN
- China
- Prior art keywords
- program
- concurrent
- event
- noise
- variable
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明针对并发程序测试中交织覆盖难问题,公开了一种并发程序噪声注入方法,属于并发程序测试领域。首先对被测并发程序运行时各共享变量被访问次数进行统计,根据访问次数由高到低对共享变量进行排序;然后按照次序由高到低依次对每一个共享变量相关的事件计算出插入噪声的概率;最后在每个事件上以不同概率插入噪声,用测试用例执行程序,直到不再出现新的并发交织。本发明提供了一种并发程序噪声注入方法,能够有效地增加并发程序测试中并发交织数量,提高测试效率。
Description
技术领域
本发明属于并发程序测试领域,具体涉及到并发程序测试中交织覆盖问题,提供了一种并发程序噪声注入方法,主要解决并发程序运行过程中出现的线程交织过少,测试难以覆盖更多交织的问题。
背景技术
多核处理器进入普通计算机加速了多线程设计软件的开发,互联网以及服务器端并发编程的日益普及使得并发缺陷分析成为一个很重要的问题。然而,多线程编程的要求非常高,并且错误空间更大。
并发测试的困难:并发程序的调度机制为并发程序的执行引入了非确定性。可能的交织集是巨大的(每种可能的执行称为一个交织),遍历它们是不实际的。这些交织中只有少数实际产生并发错误,因此,产生并发错误的可能性非常低。无意的数据竞争和死锁等缺陷很难发现和分析且代价高昂,而且经常逃逸;具体平台下调度程序通常是确定性的,多次执行相同的测试无济于事,因为将创建相同的交织集,多次执行并不能发现新的错误。此外,即使程序已经使用给定的输入多次执行而没有发现任何错误,将来仍然可能使用相同的输入执行产生不正确的结果。检测并发错误通常耗时很长并且在不同的环境条件下运行。因此,这些测试不一定是可重复的,并且当检测到并发错误时,必须投入很多努力来重建其发生的条件。这种情况刺激了致力于各种测试、分析和验证方法的研究工作。
本发明通过使用噪声注入技术,在适当的程序位置插入噪声改变线程调度,以出现更多的并发程序交织,从而增加并发错误产生的可能性。由于可能的状态空间是巨大的,通过计算被测程序中各事件增加并发交织的可能性,将噪声插入到更有可能增加并发交织的事件上,进而提高不同交织发生的可能,提高并发程序测试中并发交织的数量,解决并发程序测试中并发交织难覆盖的问题。
发明内容
噪声注入技术是指在并发程序中插入噪声语句,干扰并发程序调度,增强程序执行上下文切换的可能,即CPU从一个线程切换到另一个线程,以产生更多可能的并发交织,增加并发错误出现的概率,提高并发程序测试的效率。
本发明的技术方案为:一种并发程序噪声注入方法。如图1所示,该方法的特征主要包括以下步骤:
步骤一:针对一个待测的并发程序P,假设程序P中有m个共享变量,运行待测程序P,统计程序P运行过程中各个共享变量被访问的次数,根据各共享变量被访问的次数由高到低对共享变量进行排序:v1,v2,...,vm,其中v1为被访问次数最多的共享变量,vm为被访问次数最少的共享变量,i为1到m之间的任意一个整数值,vi表示程序P运行过程中各共享变量根据被访问次数由高到低排序后排名第i的共享变量;
步骤二:访问共享变量的每个程序位置称作一个事件,假设被测程序P中与共享变量vi(1<=i<=m)相关的事件有n个:li1,li2,...,lij,...,lin,其中li1为与共享变量vi相关的第1个事件,lij为与共享变量vi相关的第j个事件,lin为与共享变量vi相关的第n个事件,j为1到n之间的任意一个整数值,令i=1,令j=1;
步骤三:针对被测程序P中与共享变量vi(1<=i<=m)相关的n个事件li1,li2,...,lij,...,lin,每一个事件都计算该事件注入噪声的概率:
(1)针对每一个事件lij(1<=j<=n),确定考查因子k,k值的选取方法为:当1<=n<=3时,令k=1;当3<n<=10时,令k=2;当10<n<=30时,令k=3;当30<n<=100时,令k=4;当n>100时,令k=5;生成一个0-1000之间的随机数r,在事件lij和随机选取其他k-1个事件后插入噪声语句Thread.sleep(r),执行测试用例集重复运行程序w次,一般情况下令w=100,统计程序在运行过程中出现新的线程交织的次数c,进而得出事件lij增加并发交织的概率pij=c/w;
(2)根据事件lij增加并发交织的概率pij,确定在事件lij处插入噪声的概率fij:当pij>=0.2时,令fij=1;当0.15<=pij<0.2时,令fij=0.9;当0.1<=pij<0.15时,令fij=0.7;当0.05<=pij<0.1时,令fij=0.5;当0<pij<0.1时,令fij=0.3;当pij=0时,令fij=0;
步骤四:根据上述步骤三得到的噪声注入结果,在与共享变量vi相关的n个事件li1,li2,...,lij,...,lin上分别以fi1,fi2,...,fij,...,fin的概率插入噪声:生成一个0-100之间的随机数r1,生成一个0-1000之间的随机数r2,如果r1<=fij*100,在事件lij后插入噪声语句Thread.sleep(r2);
传统的随机噪声注入方法是指在与共享变量相关的所有事件上以相同概率插入噪声,增强程序执行上下文切换。但由于在某些事件上插入噪声反而会掩盖一些并发交织,随着噪声注入数量的增多,出现的并发交织数量并不会单调增加,相反会有所下降。本发明通过计算出每个事件增加并发交织的概率以及在每个事件上插入噪声的概率,在与共享变量相关的每个事件上以不同概率插入噪声,增加了新的并发交织出现的可能性;实验结果显示(由图3所示),本方法增加并发交织的结果优于传统的随机噪声注入方法,能够有效地增加并发程序测试中并发交织数量,提高测试效率。
附图说明
附图1为本发明的流程图。
附图2为一个Java并发实例程序P1。
附图3为本发明方法与传统方法进行噪声注入的结果对比图。
具体实施方式
以图2所示的Java并发程序P1为例,结合附图1对本发明提出的一种并发程序噪声注入方法的具体实施方式进行说明。
步骤一:针对一个待测的并发程序P1,程序P1中有2个共享变量:x,z,运行待测程序P1,统计程序P1运行过程中各个共享变量被访问的次数,共享变量x被访问次数为36,共享变量z被访问次数为22,根据各共享变量被访问的次数由高到低对共享变量进行排序:v1(x),v2(z),其中x为被访问次数最多的共享变量,z为被访问次数最少的共享变量;
步骤二:i为1到2之间的任意一个整数值,vi表示程序P1运行过程中各共享变量根据被访问次数由高到低排序后排名第i的共享变量,访问共享变量的每个程序位置称作一个事件,假设被测程序P1中与共享变量vi(1<=i<=m)相关的事件有n个:li1,li2,...,lij,...,lin,其中li1为与共享变量vi相关的第1个事件,lij为与共享变量vi相关的第j个事件,lin为与共享变量vi相关的第n个事件,j为1到n之间的任意一个整数值,令i=1,令j=1;
步骤三:针对被测程序P1中与共享变量v1(x)相关的3个事件l11,l12,l13,在其中k个事件上插入噪声:由于1<=n=3<=3,令k=1;
(1)针对与共享变量v1(x)相关的插入噪声的1个事件,在事件l11处:生成一个0-1000之间的随机数r,在事件l11后插入噪声语句Thread.sleep(r),重复运行程序w次,令w=100,程序在运行过程中出现新的线程交织的次数为17,进而得出事件l11增加并发交织的概率p11=c/w=0.17;
(2)根据事件l11处增加并发交织的概率p11,确定在事件l11处插入噪声的概率f11:由于0.15<=p11=0.17<0.2,令f11=0.9;
(3)j=1<n=3,令j=j+1=2,重复上述(1)和(2);
针对与共享变量v1(x)相关的插入噪声的1个事件,在事件l12处:生成一个0-1000之间的随机数r,在事件l12后插入噪声语句Thread.sleep(r),重复运行程序w次,令w=100,程序在运行过程中出现新的线程交织的次数为24,进而得出事件l12增加并发交织的概率p12=c/w=0.24;
根据事件l12处增加并发交织的概率p12,确定在事件l12处插入噪声的概率f12:由于p12=0.24>=0.2,令f12=1;
j=2<n=3,令j=j+1=3,重复上述(1)和(2);
针对与共享变量v1(x)相关的插入噪声的1个事件,在事件l13处:生成一个0-1000之间的随机数r,在事件l13后插入噪声语句Thread.sleep(r),重复运行程序w次,令w=100,程序在运行过程中出现新的线程交织的次数为0,进而得出事件l13增加并发交织的概率p13=c/w=0;
根据事件l13处增加并发交织的概率p13,确定在事件l13处插入噪声的概率f13:由于p13=0,令f13=0;
j=3=n,执行步骤四;
步骤四:根据上述步骤得出的结果f11,f12,f13,在与共享变量v1(x)相关的3个事件l11,l12,l13上分别以f11,f12,f13的概率插入噪声:生成一个0-100之间的随机数r1,生成一个0-1000之间的随机数r2,如果r1<=f11*100,在事件l11后插入噪声语句Thread.sleep(r2),如果r1<=f12*100,在事件l12后插入噪声语句Thread.sleep(r2),如果r1<=f13*100,在事件l13后插入噪声语句Thread.sleep(r2);
步骤五:针对共享变量v1(x),p11+p12+p13≠0且i=1<m=2,令i=i+1=2,重复上述步骤三、步骤四、步骤五;
针对被测程序P1中与共享变量v2(z)相关的2个事件l21,l22,在其中k个事件上插入噪声:由于1<=n=2<=3,令k=1;
针对与共享变量v2(z)相关的插入噪声的1个事件,在事件l21处:生成一个0-1000之间的随机数r,在事件l21后插入噪声语句Thread.sleep(r),重复运行程序w次,令w=100,程序在运行过程中出现新的线程交织的次数为8,进而得出事件l21增加并发交织的概率p21=c/w=0.08;
根据事件l21处增加并发交织的概率p21,确定在事件l21处插入噪声的概率f21:由于0.05<=p21=0.08<0.1,令f21=0.5;
j=1<n=2,令j=j+1=2,重复上述步骤四;
针对与共享变量v2(z)相关的插入噪声的1个事件,在事件l22处:生成一个0-1000之间的随机数r,在事件l22后插入噪声语句Thread.sleep(r),重复运行程序w次,令w=100,程序在运行过程中出现新的线程交织的次数为0,进而得出事件l22增加并发交织的概率p22=c/w=0;
根据事件l22处增加并发交织的概率p22,确定在事件l22处插入噪声的概率f22:由于p22=0,令f22=0;
j=2=n,执行步骤五;
根据上述步骤得出的结果f21,f22,在与共享变量v2(z)相关的2个事件l21,l22上分别以f21,f22的概率插入噪声:生成一个0-100之间的随机数r1,生成一个0-1000之间的随机数r2,如果r1<=f21*100,在事件l21后插入噪声语句Thread.sleep(r2),如果r1<=f22*100,在事件l22后插入噪声语句Thread.sleep(r2);
针对共享变量v2(z),i=2=m,结束整个步骤,完成该方法。
实验分析:
在图2所示的Java实例程序P1中,可能出现的线程交织有4种,分别为:y=2/x=1,y=2/x=2,y=1/z=1,by zero异常。如图3所示,在不注入噪声的情况下运行程序P1100次,出现了3种线程交织;在使用传统随机方法注入噪声的情况下运行程序P1100次,出现了3种线程交织;在使用本发明方法注入噪声的情况下运行程序P1100次,出现了所有可能出现的4种线程交织。实例分析表明,本发明提出的一种并发程序噪声注入方法与传统的随机噪声注入方法相比,能够有效地增加并发程序运行过程中出现的并发交织数量,解决并发程序测试中并发交织难覆盖的问题,提高并发程序的效率。
Claims (2)
1.一种并发程序噪声注入方法,其特征在于包括以下几个步骤:
步骤一:针对一个待测的并发程序P,假设程序P中有m个共享变量,执行测试用例集运行待测程序P,统计程序P运行过程中各个共享变量被访问的次数,根据各共享变量被访问的次数由高到低对共享变量进行排序:v1,v2,...,vm,其中v1为被访问次数最多的共享变量,vm为被访问次数最少的共享变量,i为1到m之间的任意一个整数值,vi表示程序P运行过程中各共享变量根据被访问次数由高到低排序后排名第i的共享变量;
步骤二:访问共享变量的每个程序位置称作一个事件,假设被测程序P中与共享变量vi(1<=i<=m)相关的事件有n个:li1,li2,...,lij,...,lin,其中li1为与共享变量vi相关的第1个事件,lij为与共享变量vi相关的第j个事件,lin为与共享变量vi相关的第n个事件,j为1到n之间的任意一个整数值,令i=1,令j=1;
步骤三:针对被测程序P中与共享变量vi(1<=i<=m)相关的n个事件li1,li2,...,lij,...,lin,每一个事件都计算该事件注入噪声的概率:
(1)针对每一个事件lij(1<=j<=n),确定考查因子k,k值的选取方法为:当1<=n<=3时,令k=1;当3<n<=10时,令k=2;当10<n<=30时,令k=3;当30<n<=100时,令k=4;当n>100时,令k=5;生成一个0-1000之间的随机数r,在事件lij和随机选取其他k-1个事件后插入噪声语句Thread.sleep(r),执行测试用例集重复运行程序w次,一般情况下令w=100,统计程序在运行过程中出现新的线程交织的次数c,进而得出事件lij增加并发交织的概率pij=c/w;
(2)根据事件lij增加并发交织的概率pij,确定在事件lij处插入噪声的概率fij:当pij>=0.2时,令fij=1;当0.15<=pij<0.2时,令fij=0.9;当0.1<=pij<0.15时,令fij=0.7;当0.05<=pij<0.1时,令fij=0.5;当0<pij<0.1时,令fij=0.3;当pij=0时,令fij=0;
步骤四:根据上述步骤三得到的噪声注入结果,在与共享变量vi相关的n个事件li1,li2,...,lij,...,lin上分别以fi1,fi2,...,fij,...,fin的概率插入噪声:生成一个0-100之间的随机数r1,生成一个0-1000之间的随机数r2,如果r1<=fij*100,在事件lij后插入噪声语句Thread.sleep(r2);
2.根据权利要求书1所述的一种并发程序噪声注入方法,其特征在于:该方法应用于并发程序测试中并发交织覆盖难问题,能够有效地增加并发程序运行过程中出现并发交织数量,提高并发程序测试效率。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910347672.2A CN110083538B (zh) | 2019-04-28 | 2019-04-28 | 一种并发程序噪声注入方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910347672.2A CN110083538B (zh) | 2019-04-28 | 2019-04-28 | 一种并发程序噪声注入方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110083538A CN110083538A (zh) | 2019-08-02 |
CN110083538B true CN110083538B (zh) | 2022-09-30 |
Family
ID=67417184
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910347672.2A Active CN110083538B (zh) | 2019-04-28 | 2019-04-28 | 一种并发程序噪声注入方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110083538B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111563043B (zh) * | 2020-05-11 | 2022-11-01 | 西安邮电大学 | 一种并发程序测试噪声注入优化方法 |
CN112269736B (zh) * | 2020-10-26 | 2022-11-01 | 西安邮电大学 | 多目标并发程序噪声注入群体优化方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102439561A (zh) * | 2009-04-29 | 2012-05-02 | 超威半导体公司 | 在同步多线程机上使用比较和传送指令的可靠执行 |
CN102760095A (zh) * | 2011-04-25 | 2012-10-31 | 清华大学 | 基于静态共享变量识别的动态数据竞争检测方法 |
CN107391381A (zh) * | 2017-07-31 | 2017-11-24 | 东南大学 | 一种基于锁对象拆分策略的并发程序测试方法及其测试系统 |
CN107577525A (zh) * | 2017-08-22 | 2018-01-12 | 努比亚技术有限公司 | 一种创建并发线程的方法、装置及计算机可读存储介质 |
CN109213665A (zh) * | 2018-09-07 | 2019-01-15 | 北京航空航天大学 | 一种分布式并发加速测试技术与平台的构建方法 |
CN109635568A (zh) * | 2018-11-26 | 2019-04-16 | 华中科技大学 | 一种基于静态分析和模糊测试相结合的并发漏洞检测方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8327334B2 (en) * | 2007-10-17 | 2012-12-04 | International Business Machines Corporation | Replay of program executions using cross-entropy |
US8479166B2 (en) * | 2008-08-25 | 2013-07-02 | International Business Machines Corporation | Detecting locking discipline violations on shared resources |
-
2019
- 2019-04-28 CN CN201910347672.2A patent/CN110083538B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102439561A (zh) * | 2009-04-29 | 2012-05-02 | 超威半导体公司 | 在同步多线程机上使用比较和传送指令的可靠执行 |
CN102760095A (zh) * | 2011-04-25 | 2012-10-31 | 清华大学 | 基于静态共享变量识别的动态数据竞争检测方法 |
CN107391381A (zh) * | 2017-07-31 | 2017-11-24 | 东南大学 | 一种基于锁对象拆分策略的并发程序测试方法及其测试系统 |
CN107577525A (zh) * | 2017-08-22 | 2018-01-12 | 努比亚技术有限公司 | 一种创建并发线程的方法、装置及计算机可读存储介质 |
CN109213665A (zh) * | 2018-09-07 | 2019-01-15 | 北京航空航天大学 | 一种分布式并发加速测试技术与平台的构建方法 |
CN109635568A (zh) * | 2018-11-26 | 2019-04-16 | 华中科技大学 | 一种基于静态分析和模糊测试相结合的并发漏洞检测方法 |
Non-Patent Citations (5)
Title |
---|
SWORD: A Bounded Memory-Overhead Detector of OpenMP Data Races in Production Runs;Simone Atzeni;《2018 IEEE International Parallel and Distributed Processing Symposium (IPDPS)》;20180806;845-854 * |
基于二型模糊逻辑的多线程数据竞争检测方法研究;杨璐等;《计算机科学》;20171215(第12期);全文 * |
基于交互行为的恶意代码检测研究;孙晓妍等;《计算机应用》;20100601(第06期);全文 * |
基于多核CPU的并行程序在指控系统中的应用;范瑞娟等;《微型电脑应用》;20081220(第12期);全文 * |
基于并发程序数据竞争故障的变异策略;吴俞伯等;《计算机应用》;20161110(第11期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN110083538A (zh) | 2019-08-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Sen | Effective random testing of concurrent programs | |
Farchi et al. | Concurrent bug patterns and how to test them | |
US20110131550A1 (en) | Concurrency Software Testing with Probabilistic Bounds on Finding Bugs | |
US8185875B2 (en) | Fast and accurate static data-race detection for concurrent programs | |
Gong et al. | Automatic detection of infeasible paths in software testing | |
CN110083538B (zh) | 一种并发程序噪声注入方法 | |
US20150143179A1 (en) | System and Method for Progressive Fault Injection Testing | |
CN102073588A (zh) | 一种基于代码静态分析的多线程死锁检测方法及系统 | |
CN110399182B (zh) | 一种cuda线程放置优化方法 | |
CN111459798A (zh) | 测试方法、装置、介质及电子设备 | |
US9176732B2 (en) | Method and apparatus for minimum cost cycle removal from a directed graph | |
CN112988587A (zh) | 一种程序检测方法及装置 | |
CN110851353B (zh) | 一种基于Delta Debugging与约束求解的并发程序缺陷定位方法 | |
Kim et al. | Failure history data-based test case prioritization for effective regression test | |
Tunç et al. | Sound dynamic deadlock prediction in linear time | |
US8286141B2 (en) | Instruction-trace generation program, instruction-trace generating device, and instruction-trace generating method | |
US7788242B2 (en) | Method and system for implementing a concurrent set of objects | |
CN112765827B (zh) | 一种功能相关系统的可靠性分析方法 | |
Chockler et al. | Cross-entropy based testing | |
CN114201358B (zh) | 一种基于系统调用序列的多线程程序异常检测方法 | |
US9489284B2 (en) | Debugging method and computer program product | |
Fournier et al. | A probabilistic analysis of coverage methods | |
CN111240881A (zh) | 基于贝叶斯网络的Web服务组合异常诊断方法 | |
CN111459808A (zh) | 一种基于类型推断的具有引导性的测试用例变异方法 | |
Lick et al. | Hybrid branch prediction using limited dual path execution |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |