Abstract
探索了程序自动修复方法在状态机修复里的应用,尝试借鉴,解决生成修复措施的核心问题。
分析了此类方法在普通程序中可行,却在TAP规则状态机里不可行的原因。
针对该原因,提出了一种从状态机层面、Solution Space角度思考的方法。
同时从二分查找里找到一种减少状态空间的方法。
一、缺陷定位
1.1 普通程序的缺陷定位
利用CEX修复网络缺陷,程序的任意地方、predicate都有可能是可疑的,
-------------
| |-----------
| |-----------
|---------------
因为不好确定是哪个predicate导致的错误
1.2 状态机的缺陷定位
AutoTap默认了在前一状态triggers the bug,即缺陷在前一状态
状态机不同的是suspicious statements先对固定,数量不大而不会生成大量操作
二、补丁生成
一篇程序自动修复综述+两篇基于人工模板修复。
Solution Space对程序自动修复的影响
2.1 普通程序中的solution space
solution语料库 组成 patch,patch组成solution space
solution space中包括缺陷的修复方法。S = C ∪I ∪X (correct patches、 不可信 ones、 可信 but incorrect ones)其来源于某部分原有的或扩展的程序,原有或扩展的程序中可能出现错误代码的正确处理。
基于启发式的方法通过利用历史代码、本程序相似代码或变异代码得到语料,通过组合语料尽可能推理整个solution space,以此找到修复方法。利用CEX修复网络缺陷应该属于这类。
基于人工模板的方法,通过静态分析data and control dependences等详细语料信息,使得修复方法更adequate。
2.2 TAP规则的状态机中的solution space
solution space 来源于当前构建的状态机,状态机中如果包含所有状态,那么Solution Space有解,如羊狼过河。
这和之前利用历史代码、本程序相似代码的思想类似。
!( ((goat = cabbage | goat = wolf)->man = goat) U (man & cabbage & goat & wolf) )
如果状态机不足,这种利用相似代码的思想就会无法生成解决方法。因为很可能是没出现过的状态。 例子如下:
反例的思想,
[state] should [always] be active G(state),比如冰箱要一直打开
返回一条off的
[state] should [never] be active ¬F(state)
返回一条一直on的,但是可能是正常的,且是在当前TAP语境下的,
如果不反悔,说明当前状态机没有,即有问题
S = C ∪I ∪X I就是正常的路径
一种思路是完善状态机。另一种思路就是交给外部处理如AutoTap
三、细化Solution Space
3.1 扩展
by including more correct patches and less incorrect ones from the entire solution space S = L × O(整个状态机)
3.1.1 加入由property的生成的初始规则
3.1.2 light > 500改为变量light > config_value理论上存在一条路径为全局最终解
light > 500改为变量light > config_value理论上存在一条路径为全局最终解。因为修改后的被应用到下一次状态中了,有迭代的感觉,但反例不一定是该条路径,导致生成的只适用于该反例
而且把建模加入下一轮,也保证了全局性。
3.1.3 基于人工修复模板加入每轮建模,也保证了全局性。相当于验证patch的正确性
修复方法会 introduce new bugs
引起状态机状态变化的是因为trigger触发的action和自然环境的变化。可以根据缺陷的root cause事先生成一些模板
基于人工修复模板:从现有规则中根据action是否存在潜在冲突,提取trigger中的语义并组合为模板
问题:单条TAP规则 并且 a single action to redirect (Action Breaking是两条)
physical channel建模时也会考虑,所以一举两得
利用变异。朝着预定方向变化,fitness function,扩展Solution Space,同时有个
3.2 Reduce Solution Space
一篇符号执行综述+AFL源码分析的变异部分文章。通过符号执行reduce solution space,二分查找。
the solution space L×O is thus reduced to a subset L × O= C ∪ I ∪ X ,
二分查找的思路: 先取中间,根据结果去哪一半,然后再取中间。数也是有序的,最合适的配置值就是我们要搜索的,其特点是false和true
四、前后模型对比
还是两个模型,只是反例模型变为了扩展模型
仍要用CEX,但是CEX和原来一样就和AutoTap没差别。CEX里有修复措施,人为去比去确认
问题
问题:创新点?raining的怎么改,目前偏向于修改而不是新增
问题:多action