Go語言精進之路讀書筆記第45條——使用模糊測試讓潛在bug無處遁形

brynchen發表於2024-03-10

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

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

相關文章