模糊測試就是指半自動地為程式提供非法的、非預期、隨機的資料,並監控程式在這些輸入資料下是否會出現崩潰、內建斷言失敗、記憶體洩漏、安全漏洞等情況。
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