- Go語言精進(jìn)之路:從新手到高手的編程思想、方法和技巧(2)
- 白明
- 749字
- 2022-01-04 17:42:25
45.5 讓模糊測(cè)試成為“一等公民”
go-fuzz的成功和廣泛應(yīng)用讓Gopher認(rèn)識(shí)到模糊測(cè)試對(duì)挖掘潛在bug、提升代碼質(zhì)量有著重要的作用。但目前Go尚未將模糊測(cè)試當(dāng)成“一等公民”對(duì)待,即還沒有在Go工具鏈上原生支持模糊測(cè)試,模糊測(cè)試在Go中的應(yīng)用還僅限于使用第三方的go-fuzz或谷歌開源的gofuzz。
但當(dāng)前的go-fuzz等工具的實(shí)現(xiàn)存在一些無法解決的問題[1],比如:
- go-fuzz模仿Go工具構(gòu)建邏輯,一旦Go原生工具構(gòu)建邏輯發(fā)生變化,就會(huì)導(dǎo)致go-fuzz-build不斷損壞;
- go-fuzz-build無法處理cgo,很難實(shí)現(xiàn);
- 目前的代碼覆蓋率工具(coverage)是通過在源碼中插入樁代碼實(shí)現(xiàn)的,這使其很難與其他構(gòu)建系統(tǒng)(build system)集成;
- 基于從源碼到源碼的轉(zhuǎn)換無法處理所有情況,并且轉(zhuǎn)換功能有限,某些代碼模式可能會(huì)處理不當(dāng)或?qū)е聵?gòu)建失敗;
- 使用從源碼到源碼轉(zhuǎn)換的方法產(chǎn)生的代碼運(yùn)行很慢。
這些問題需要編譯器層面的支持,也就是在編譯器層面添加支持模糊測(cè)試的基礎(chǔ)設(shè)施(比如代碼覆蓋率樁的插入)。同時(shí),如果模糊測(cè)試能像go test、go test -bench那樣直接通過Go工具鏈執(zhí)行(比如go test -fuzz=.),模糊測(cè)試代碼能像普通單元測(cè)試代碼那樣直接編寫在*_test.go文件中,像下面這樣:
// xxx_test.go func FuzzXxx(f *testing.F, data []byte) { // ... }
那么模糊測(cè)試才算真正得到了“一等公民”的地位,這一直是模糊測(cè)試在Go語言中的努力方向。目前Go官方已經(jīng)在討論將模糊測(cè)試納入Go工具鏈的實(shí)現(xiàn)方案了(https://github.com/golang/go/issues/19109)。
小結(jié)
通過這一條,我們認(rèn)識(shí)到模糊測(cè)試對(duì)于提升Go代碼質(zhì)量、挖掘潛在bug的重要作用。但模糊測(cè)試不是“銀彈”,它有其適用的范圍。模糊測(cè)試最適合那些處理復(fù)雜輸入數(shù)據(jù)的程序,比如文件格式解析、網(wǎng)絡(luò)協(xié)議解析、人機(jī)交互界面入口等。模糊測(cè)試是軟件測(cè)試技術(shù)的一個(gè)重要分支,與單元測(cè)試等互為補(bǔ)充,相輔相成。
目前,并非所有編程語言都有對(duì)模糊測(cè)試工具的支持,Gopher和Go社區(qū)很幸運(yùn),Dmitry Vyukov為我們帶來了go-fuzz模糊測(cè)試工具。如果你是追求高質(zhì)量Go代碼的開發(fā)者,請(qǐng)為你的Go代碼建立起模糊測(cè)試。
- C++ Primer習(xí)題集(第5版)
- 測(cè)試驅(qū)動(dòng)開發(fā):入門、實(shí)戰(zhàn)與進(jìn)階
- Git高手之路
- Mastering Unity Shaders and Effects
- 實(shí)戰(zhàn)Java高并發(fā)程序設(shè)計(jì)(第3版)
- Learning Network Forensics
- Java 11 Cookbook
- R Deep Learning Cookbook
- JavaScript入門經(jīng)典
- HTML5從入門到精通 (第2版)
- 區(qū)塊鏈國(guó)產(chǎn)化實(shí)踐指南:基于Fabric 2.0
- Instant Zurb Foundation 4
- Getting Started with JUCE
- Design Patterns and Best Practices in Java
- 你好!Python