基于频谱信息,定位导致程序故障的编辑
www.fireknight.tech 个人博客,欢迎访问,CSDN不定期更新
总结
-
本文是ekstazi的对比工具,ekstazi相比其有一定的时间提升。但ekstazi没有
select affecting change
的功能 -
是Chianti的升级版
- 修复了一些对于静态变量、变量的override导致的unsafety
- 同时
affecting change
的选择增加了基于频率的排序,原因寻找更加准确
Abstract
-
变更影响分析是一种在迭代系统中寻找错误的广泛使用的方法
-
定位错误源困难
-
错误源候选项太多 – Chianti
-
FAULTTRACER
- 在回归测试选择上类似,修复了一些安全问题
- 在确定影响因子上有大约20%的提升
-
INTRO
-
回归测试困难、定位错误困难
-
Chianti缺点:
- 影响因子候选项太多:ant6-7版本,大约有22-182平均100个原子更改候选
-
新技术:基于频谱的语句上的错误定位(没有两个版本程序对比,导致定位候选过多)
-
频谱信息+错误定位
-
贡献:
- 迭代系统的故障定位:基于频谱采用四种算法的故障定位
- ECG:扩展调用图
- 实验验证
RELATED WORK
- 变更影响分析:测试选择
- 错误定位
FaultTracer
-
过程:
-
- 计算原子更改和依赖
- 通过分析测试对应的ECG,选择测试
- 如果测试失败,选择有关的更改/影响因子
- 使用频谱信息对影响因子进行排序
-
-
A 基于ECG的变更影响分析
-
原子更改
- 通过对比抽象语法树来计算原子更改
- 引入 LCf
-
原子更改依赖
-
Chianti:假阳性依赖
- 未很好处理方法重载和变量隐藏
-
Callee(m) Access(m)
-
- 第二排:
LCf: 变更c属于AF或者DF,并且f造成了lc改变
- 第三排:
m调用m', m'是AM,并且m'重载的所有方法也属于AM, 那么m'依赖于m
- 避免了:任何被覆盖的方法(或隐藏字段)都可以在没有覆盖的方法(或隐藏字段)的情况下编译新版本。
Otherwise, any overridden method (or hidden field) can make the new version compile without the overriding method (or the hiding field)
- 第四排DM同理
- 第五排:调用依赖?
- 第二排:
-
// 没有明白这段的意思。依赖是为了计算影响因子,这里让依赖更严格?
-
-
ECG:
-
lookup change
-
<T,C.m>
实际接收者,标记方法target -
<Op, C.f>
对变量的访问修改Op := FW|FR|SFW|SFR
- 用不同的操作去匹配
-
-
-
测试选择
-
- 选择方法更改或者读变量
- 选择和方法lookup对应的边
- 选择和变量lookup对应的边
-
使用变量ECG的优点
-
不再需要把CFI和CSFI对应到CM(chainti),这次直接对应节点,CFI对应到FW和FR
-
避免不使用LCf带来的假阴性选择
-
举例
-
-
-
测试1、2修改了
CSFI(A.f1) and CSFI(A.f2)
,导致CM(A.Clinit)
改变。于是Chianti选择了测试1没有选择测试2(只初始化一次) [假阳性] -
FT没有选择1,因为
CSFI(A.f1)
对应的是SFW,但是选择2因为识别到f1对应读一个修改 -
Chianti对于测试4没有选择,因为没有识别到LCf的改变
-
-
-
选择影响因子
-
选择在新ECG上的节点和边
- 选择所有非lookup-change的改变
- 选择造成lookup-change的改变
-
举例
-
对于test3
-
chianti:
-
CFI(B.f2), CFI(B.f3), AF(B.f4), CM(B.foo)
CM(B.foo) 依赖于 AF(B.f4)
CM(B.B) 依赖于CFI(B.f2) and CFI(B.f3)
- 选择
CFI(B.f2), CFI(B.f3), AF(B.f4)
-
-
FT
-
CM(B.foo)
-
-
只涉及到对改动f1的读
-
-
-
-
-
B 基于频谱的排序
-
使用了四种计算方法
-
通过计算一个原子更改在所有测试中通过的测试和未通过的次数进行排序
-
-
一些统计上的计算吧
-
-
C 实现
-
ECG
- ASM分析工具
-
原子变更
- Eclipse JDT toolkit工具
- 便利抽象语法树,通过字段和方法的完全限定名来比较
-