论文部分内容阅读
由于多线程程序线程之间交互的不确定性,并发程序存在难调试、难测试的问题,并发缺陷检测是软件测试领域的难点问题。对多线程程序的测试方法可以分为静态方法和动态方法两种,静态测试方法始终存在误报率高、精确度低的局限性,而动态测试方法在降低误报率、提高精确度的同时,引入了大量的测试运行开销。 本文针对并发缺陷中的死锁缺陷和数据竞争缺陷,优化了两种经典算法FastTrack算法和PCT算法,提出两种并发缺陷动态检测方法,基于反转Happens-Before边的数据竞争检测方法DrFinder+和基于半径的随机调度死锁检测方法RPro+,试图提高并发缺陷动态检测效率,降低动态测试的运行开销。依据在测试过程中收集的“May-Trigger”关系,DrFinder+在程序调度时反转Happens-Before边,使一次测试能够暴露更多的隐藏Happens-Before边。RPro+采用基于半径的方法缩小随机调度中优先转换点的选点范围,提高检测并发缺陷的概率保证,大大减少了算法测试并发缺陷的运行次数。另外,由于许多研究在比较并发缺陷算法时采用了不同的测试基准集和运行环境,为保证算法对比的公平性和缺陷检测工具的拓展性,本文在Intel PIN和Java ASM的基础上,设计并实现了C++和JAVA程序的并发缺陷检测通用平台。在此平台上,所有算法运行在统一的测试基准集和运行环境上。 依托实现的并发缺陷检测通用平台,本文对Mysql、Eclipse等多个真实程序进行了并发缺陷检测。实验表明,DrFinder+算法在10次运行中检测到118个新的数据竞争,而其他算法(FastTrack,PCT,ConTest)在100次运行中都没有检测到;RPro+算法显著提高了随机调度的测试效率,在检测到相同数目的死锁缺陷时,PCT算法需要多执行40%-40000%的测试运行次数。