主要观点:Fuzz Map 是用于 GUIs 的模糊测试工具,可自动通过代码覆盖率识别状态并构建可视化地图,即使不懂代码的人也有用。
关键信息:
- 有互动本地演示,可通过点击按钮开始模糊测试等操作。
- 包含实时模糊测试视频,地图中状态和箭头对应模糊测试发现的代码路径。
- 有沙盒可渲染 React 代码,支持编译和重置等操作,地图支持平移和缩放。
- 聚焦于功能,也可了解工作原理,研究原型在浏览器中运行,不上传数据。
- 介绍了实时编程,第二次模糊测试通常更快,因为输入可保存重用。
- 能检测到渲染状态或处理事件时的错误并在地图中显示。
- 有 Before/After 视图列出输入的情况,可用于调试。
- 工作原理是利用代码覆盖率区分 GUI 状态并渲染为简化地图,通过状态图高效探索状态,随机模糊测试效率低,使用代码覆盖率识别已见状态。
- 介绍了分支覆盖,通过编译时插装记录分支覆盖和获取命中向量,处理短路表达式等。
- 状态图很大,通过简化为地图图使其可读,简化过程使用夹紧和分支合并等启发式方法。
- 可在程序修改后应用输入,设计为尽可能无需手动注释,有启发式方法处理输入路径。
- 存在局限性,未来版本将解决,如生成复杂输入、处理异步事件、处理运行时定义的事件处理程序等。
重要细节: - 如在处理结账示例中的错误,代码中可能遗漏
reduce
的第二个参数导致错误。 - 事件处理程序可通过
onClickContinue
等定义,错误会在地图中显示,悬停可查看错误。 - 在 Before/After 视图中可查看不同情况,修改后的代码处理数量变化时可能出现错误。
- 状态图中节点代表应用状态,边代表事件处理程序的输入,命中向量描述执行的分支。
- 随机模糊测试在特定 GUI 结构下效率低,Fuzz Map 利用代码覆盖率只需约
n
次输入。 - 模糊测试时首次看到状态会生成可能的输入放入队列,通过启发式方法选择队列中的项进行模糊测试。
- 编译时插装用于记录分支覆盖,通过插入命中计数器实现,利用命中向量识别状态。
- 短电路表达式在 React 中常用,需要对其进行插装,不同表达式有不同的转换方式。
- 地图图是状态图的简化版本,通过组合节点和边创建,简化过程使用多种启发式方法。
- 可通过
data-fuzzmap-key
HTML 属性更精确地识别元素,有启发式方法处理输入路径。 - 特别感谢 Joey Liaw 提供模糊测试 GUI 的想法,以及 elkjs 和 ELK 布局库的作者。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。