Yesterday, my program Worked.
Today, it Does Not. Why?(A Zeller)
主要内容:
本篇论文主要讲的是delta debugging。
Zeller首先给出了一些定义,configuration为全体可能的改变的集合的一个子集,test为一次测试包括PASS,FAILED和UNRESOLVED三种可能结果,对于任意包含c的改变集c'如果都有test(c')不为PASS,则c为failure-inducing集。
接着,Zeller说明了configuration可能有的三个属性,单调性,无歧义以及一致性。单调性指的是,如果test(c)FAILED那么任何包含c的集合都不可能测试通过。无歧义指的是,failure只可能由一个改变集造成,不可能由两个独立的改变集分别造成。一致性指的是,任何测试的结果都是确定的,要么PASS要么FAILED。
上面的三种性质,当然不是一定具有的,只是一种理想情况。接着,Zeller设计了dd算法来找到理想情况下的最小failure-inducing集。
dd算法基于二分查找。改变集分为c1和c2两部分。分别测试c1和c2,共有3种结果,前两种是c1或c2fail了,那么递归的在fail的集合中查找;另一种情况,就是两个集合都pass,则必然是c1中的部分改变与c2中的部分改变发生了冲突,这时应用一个集合c1中的全部改变,对另一个集合c2二分的查找与集合c1发生冲突的改变,找到之后,可以类似的找到c1中与c2发生冲突的改变。
dd算法的用处仅限于比较理想情况,这显然是不够的。接下来,Zeller说明了通过撤销操作,可以将dd算法用到有歧义和不单调的情况下。
现在,dd算法的约束只有一个一致性了。Zeller解决这一约束的方式,基于对原程序做尽可能少的改变,产生不一致性的可能越小。
Zeller将dd扩展到dd+来解决一致性的一致。在dd的基础上,增加了一些步骤。当ciPASS但是ci的补集UNRESOLVED时,则称ci是preferred的,接下来的测试可以保留ci来保证一致性。try again,指的是将原来的n个集合进行二分分成2n个集合来尽快找到有效的测试。
之后,Zeller讲了两个避免不一致性的方法。首先是将关联的改变尽可能地放在一起,其次是预测测试结果。
最后,给出两个实际例子,以及该算法的应用前景。
收获:
本文作者先构建一个约束较多的理想情况,并进行分析,然后再逐步解开约束。这一种思路,值得学习。