go mod init
喔go mod init go/fuzz
package main
import "fmt"
// 簡單的把句子反過來
func Reverse(s string) string {
b := []byte(s)
for i, j := 0, len(b)-1; i < len(b)/2; i, j = i+1, j-1 {
b[i], b[j] = b[j], b[i]
}
return string(b)
}
// 看一下 反轉一次和兩次的結果
func main() {
input := "iron man write quick in thirty days"
rev := Reverse(input)
doubleRev := Reverse(rev)
fmt.Printf("origin: %q\n", input)
fmt.Printf("reversed: %q\n", rev)
fmt.Printf("after reversed twice: %q\n", doubleRev)
}
*_test.go
的檔案,所以我們要幫它加一個 *_test.go
的 Filereverse_test.go
package main
import (
"testing"
"unicode/utf8"
)
func FuzzReverse(f *testing.F) {
testcases := []string{"Hello, iron man", " ", "98765#"}
for _, tc := range testcases {
f.Add(tc) // 把 testcase 加進 seed corpus裡
}
f.Fuzz(func(t *testing.T, orig string) {
rev := Reverse(orig)
doubleRev := Reverse(rev)
if orig != doubleRev {
t.Errorf("Before: %q, after: %q", orig, doubleRev)
}
if utf8.ValidString(orig) && !utf8.ValidString(rev) {
t.Errorf("Reverse produced invalid UTF-8 string %q", rev)
}
})
}
Seed Corpus
,而這些 Seed 的選擇將會影響 Fuzzing 的效率和測試的覆蓋率(所以還有論文特別在做 Seed Selection)我有看到留言有人想要聽更多 Fuzzing,但本篇對 Fuzzing 的解釋也不能到很全面,想了解更全面的 Fuzzing 可以去看今年另一位大大寫的文章
Seed Corpus 解釋(OSS-Fuzz算解釋蠻清楚的, 也可以去看看其他他們的文章
Seed Corpus