- FatFuzz:利用插桩(在代码块中插入日志输出),构建每个输入的代码执行流程,利用一张表记录,利用表的哈希去重,分析覆盖率,并查 bug。
- SandBoxFuzz:
- 在FatFuzz 的基础上,利用输入的钩子将占位的输入进行拦截并注入自动生成的数据。
- 利用预先声明数据的格式与类型(通过 Specification Mining(规范挖掘) 技术),利用反射的机制,通过随机生成和遗传变异两种模式,生成测试的数据。
- 测试可以自主重复运行,不需要人为构造很多的数据。
- Redis 存那些由机器自动生成的、被验证为“有效且能覆盖新代码”的优质测试用例。如果这个数据发现了新 Bug 或新路径,它就会被作为下一轮的“父辈”。
- 潜在的改进方法:
- 遗传变异的部分是否可以和覆盖率的监测更深度的联合,实现对局部更高覆盖率的定向变异?
- 随机数据和遗传变异生成的数据可能没法覆盖 corner case,对于无状态的系统,可能可以通过测试时构建输入输出的映射表,进行更多情况的覆盖。
- 对于我以前遗传算法的使用经验,先部分枚举,再遗传变异的路径会弥补前期遗传数据不足,后期枚举分支太多的问题。另外,CrossOver 的部分可能可以加入数据的微扰动,进一步增加数据的多样性。