Go语言精进之路读书笔记第45条——使用模糊测试让潜在bug无处遁形
模糊测试就是指半自动地为程序提供非法的、非预期、随机的数据,并监控程序在这些输入数据下是否会出现崩溃、内置断言失败、内存泄漏、安全漏洞等情况。
45.1 模糊测试在挖掘Go代码的潜在bug中的作用
Dmitry Vyukov 2015年使用go-fuzz在Go标准库中发现了137个bug。
45.2 go-fuzz的初步工作原理
工作流程:
- 生成随机数据
- 将上述数据作为输入传递给被测程序
- 观察是否有崩溃记录(crash),如果发现崩溃记录,则说明找到了潜在的bug
45.3 go-fuzz使用方法
1.安装go-fuzz
2.带有模糊测试的项目组织
3.go-fuzz-build
4.执行go-fuzz
适用场景:
- 处理复杂输入数据的程序
- 比如文件格式解析、网络协议解析、人机交互界面入口等
45.4 使用go-fuzz建立模糊测试的示例
被测代码
func ParseComplex(data [] byte) bool {
if len(data) == 5 {
if data[0] == 'F' && data[1] == 'U' && data[2] == 'Z' && data[3] == 'Z' && data[4] == 'I' && data[5] == 'T' {
return true
}
}
return false
}
fuzz测试代码
// +build gofuzz
package parser
func Fuzz(data []byte) int {
ParseComplex(data)
return 0
}
45.5 让模糊测试成为“一等公民”
Go工具链还没有在原生上支持go-fuzz