我要提高 Go 程序健壮性,Fuzzing 来了!
Python涨薪研究所
共 3229字,需浏览 7分钟
·
2021-07-06 08:58
源 / 文/
什么是 Fuzzing
为什么要做 Fuzzing
发生在身边的 Fuzzing
快速上手
$ go get golang.org/dl/gotip
$ gotip download dev.fuzz
// +build gofuzzbeta
package tests
import (
"net/url"
"reflect"
"testing"
)
func FuzzParseQuery(f *testing.F) {
f.Add("x=1&y=2")
f.Fuzz(func(t *testing.T, queryStr string) {
query, err := url.ParseQuery(queryStr)
if err != nil {
t.Skip()
}
queryStr2 := query.Encode()
query2, err := url.ParseQuery(queryStr2)
if err != nil {
t.Fatalf("ParseQuery failed to decode a valid encoded query %s: %v", queryStr2, err)
}
if !reflect.DeepEqual(query, query2) {
t.Errorf("ParseQuery gave different query after being encoded\nbefore: %v\nafter: %v", query, query2)
}
})
}
gotip test -fuzz=FuzzParseQuery
命令,输出结果:fuzzing, elapsed: 3.0s, execs: 319 (106/sec), workers: 4, interesting: 15
fuzzing, elapsed: 6.0s, execs: 665 (111/sec), workers: 4, interesting: 15
fuzzing, elapsed: 9.0s, execs: 1019 (113/sec), workers: 4, interesting: 15
fuzzing, elapsed: 12.0s, execs: 1400 (117/sec), workers: 4, interesting: 15
...
Fuzzing 会消耗大量的内存,在运行时会影响到机器的性能(一运行,小风扇就转了起来)。 Fuzzing 会默认使用 GOMAXPROCS
相同的核数,可以通过执行-parallel
标识来控制数量。Fuzzing 会默认在运行时,将扩大测试范围的数值写入 $GOCACHE/fuzz
内的模糊缓存目录,目前是没有限制的,可以通过运行gotip clean -fuzzcache
来清除。
总结
好文推荐
985 研究生组团诈骗,一个中招就关 App,涉案金额超 1 亿,受害人遍布全国
清华博士接亲被要求现场写代码,网友:真是面向对象编程!
字节跳动P0级事故:实习生删除GB以下所有模型,差点没上头条......
一键三连「分享」、「点赞」和「在看」
技术干货与你天天见~
评论