数据竞争检测入门文献阅读
2014 /10 /21
LOGO
姚欣洪. 基于线程摘要的C/C++数据竞争检测研究[D].
北京邮电大学, 2011.
www.ppt5u.com
基于线程摘要的C/C++数据竞争检测研究
数据竞争是常见的并发程序错误:在共享内存的并发程序中,当
有两个线程同时访问(至少有一个访问是写操作)同一个内存地址,
并且这两个访问缺乏锁同步时,这两个线程将可能发生数据竟争。如
何检测数据竞争一直是计算机技术的热门研究领域,尽管针对数据竞
争检测的研究超过了30年,但是当今的并发程序仍然存在着许多有
害的数据竞争。
这篇文章提出一种检测C/C++数据竞争的算法,根据数据竞争
的定义提出两个线程不可能发生数据竞争的四个条件,在DTS_CPP
框架的基础上实现了数据竞争检测框架。最后对一些实际的例子进
行检测,分析检测结果来证明此方法的有效性。
www.ppt5u.com
基于线程摘要的C/C++数据竞争检测研究
文章主要研究内容
【】数据竞争的定义及发生条件
(充分认识数据竞争的条件)
【】基于函数摘要和线程摘要的的数据竞争检测算法
(扩展DTS_CPP系统,函数摘要->线程摘要->线程访问特征->序列化)
【】排除法进行数据竞争检测
(根据线程不可能发生数据竞争的条件,对初始化的可能发生数据竞争的
集合刷选、精细)
www.ppt5u.com
基于线程摘要的C/C++数据竞争检测研究
相关研究
静态测试
静态测试通常会将源代码或者中间代码转换成某种中间的数据
结构,如抽象语法树或者控制流图,并组织好程序的符号表,在此基础
上用相应的算法来分析。(数据流分析,抽象解释,符号执行,模
型检测,定理证明,类型推导)
动态测试
动态测试将被测程序在相对真实环境下运行,观察其运行时的行
为、功能、逻辑、输出等属性来发现其可能存在的问题。根据作用
动态测试又可以分为单元测试、集成测试,系统测试以及回归测试等
(插桩模拟、渗透测试)
www.ppt5u.com
基于线程摘要的C/C++数据竞争检测研究
竞争条件
当并发程序中不同的线程的执行依赖于某些共享的状态时,就可
能发生竞争条件。所有对于共享状态的访问都必须进行互斥操作,否
则将可能导致有害的不确定状态。
常见的故障类型:
【】时间检查与时间使用产生的竞争条件(TOCTOU)
一个给定的资源的在时间检测和时间利用间存在漏洞的窗口
时间窗口
opendir(filename)
.
.
.
If(stat(filename,&dirstat)==0)
return ;
www.ppt5u.com
基于线程摘要的C/C++数据竞争检测研究
【】双检锁问题
通常情况下,在实现多线程环境中的“懒初始化”(变量在第一次被
访问时才初始化,以后每次访问都使用第一次初始化的值)时来避免加锁
操作,典型的应用就是单例模式 。
双检锁
helper=new Helper()操作包含多个步骤
1) 分配内存
2) 在内存的位置上调川构造函数
3) 将内存地址赋值给helper
www.ppt5u.com
基于线程摘要的C/C++数据竞争检测研究
【】不可重入问题导致的数据竞争
一个函数被重入,表示这个函数没有执行完成.由于外部因素或者内
部调用,又一次进入该函数执行。一个函数要被重入,只有两种情况:
a)多个线程同时执行这个函数;
b)函数自身(可能是经过多层调用之后)调用自身。
一个函数要成为可重入的,必须具有以下几个特点:
l)不使用任何(局部)静态或者全局非const变量;
2)不返回任何(局部)静态或者全局的非const变量的指针;
3)不调用任何不可重入的函数。
www.ppt5u.com