官术网_书友最值得收藏!

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è)試。


[1]https://github.com/golang/go/issues/14565

主站蜘蛛池模板: 梁平县| 平乡县| 平顺县| 沙雅县| 仙居县| 大厂| 滦南县| 柳河县| 邹平县| 饶平县| 潢川县| 宁远县| 宜都市| 潮州市| 嵊州市| 连云港市| 凤山市| 清镇市| 东方市| 蓬溪县| 仁化县| 顺义区| 盐山县| 荔波县| 武穴市| 沁水县| 连平县| 泰顺县| 望城县| 革吉县| 穆棱市| 九龙城区| 峡江县| 鄯善县| 平顺县| 西平县| 且末县| 滦南县| 青浦区| 河源市| 南溪县|