利用 pthread 多线程库,编写3个简易代码,包含数据竞争和原子性违反等并发缺陷,且这些缺陷的触发具有不确定性(不会每次执行都触发)
编写了三个包含并发漏洞的简易代码,漏洞内容分别为数据竞争,原子性违反以及多写者(数据竞争),分别包含于三个文件,使用 run_test.sh
将每个文件分别运行 20 次,结果如下:
-
data_race_example.cpp
: -
atomicity_violation_example.cpp
: -
shared_array_example.cpp
:
设计和实现动态测试方法,分析线程执行和同步原语情况,完成对 个简易代码中的并发缺陷检测
本方案使用锁集分析,原理为:
- 对每个变量v,初始化锁集LS(v)为被测程序中所有的锁,初始化锁集HLS(v)为空
- 分析每个线程的执行日志:
- 对于加锁操作lock(l),令HLS(v) = HLS(v)∪ {l}
- 对于解锁操作unlock(l),令HLS(v) = HLS(v) – {l}
- 对于变量v的访问操作,令LS(v) = LS(v) ∩ HLS(v),如果LS(v)为空,则报出数据竞争
src
目录中各文件的意义如下:
lock_set.cpp
对局部变量进行过滤,剩余变量以及锁操作通过调用外部函数(func.cpp
)并储存在log/log.txt
文件中,以供后续check_lock.cpp
分析。
运行run.sh
,结果如下:
可以看出实现的锁集分析的确找出了问题,但是也存在一部分的误报情况。