我正在尝试使用Go 1.18go test -fuzz
命令模糊nil值,这样我就可以确保在尝试取消引用指向字符串的指针之前不会忘记安全检查。
这是我的尝试:
// main.go
package main
import (
"fmt"
)
func HandleString(s *string) {
// most common programmer error is dereferencing nil pointers without safety checks
fmt.Println(*s)
}
func main() {
s := "Hello, world"
HandleString(&s)
}
// main_test.go
package main
import "testing"
func FuzzHandleString(f *testing.F) {
h := "hello world"
for _, seed := range []*string{nil, new(string), &h} {
f.Add(seed)
}
f.Fuzz(func(t *testing.T, in *string) {
HandleString(in)
})
}
不幸的是,我收到一个错误,说go-fuzz不支持指针,只支持字符串数据类型。
我找到了一个变通办法,把我的测试写成这样:
package main
import "testing"
func FuzzHandleString(f *testing.F) {
h := "hello world"
for _, seed := range []string{"-1", "", h} {
f.Add(seed)
}
f.Fuzz(func(t *testing.T, in string) {
if in == "-1" {
HandleString(nil)
} else {
HandleString(&in)
}
})
}
这是一个糟糕的设计,使种子数据数组不容易重复使用,并且需要每个模糊函数中的逻辑来欺骗我的方法,使其取零值。
肯定有我没有想到的更好的方法吗?
感谢
您的代码很尴尬,因为这不是模糊处理的目的。模糊化是向函数抛出随机值,以测试您可能没有想过的边缘情况。
你所做的更像是边界测试。您有一个已知的棘手输入,如nil
、空字符串或空数组。在他们自己的单元测试中测试他们。
最后,我想问一下为什么nil
是handleString
的有效输入。nil
不是字符串。除非有充分的理由,否则它应该是一个错误,并且您应该测试该错误。