我试图使用Go 1.18 go test -fuzz命令来模糊零值,以便在尝试取消引用指向字符串的指针之前确保不会忘记安全检查。
以下是我的尝试:
// 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不支持指针,只支持字符串数据类型。
我通过这样写我的测试找到了一个解决办法:
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)
}
})
}这是一个可怕的设计,使得种子数据数组不容易重用,并且需要每个模糊函数中的逻辑来欺骗我的方法获得一个零值。
肯定有更好的办法我没想过?
谢谢
发布于 2022-03-18 21:07:28
您的代码很尴尬,因为这不是毛茸茸的用途。模糊化是将随机值抛到您的函数中,以测试您可能没有考虑过的边缘情况。
您所做的更像是边界测试。您有一个已知的棘手输入,如nil、空字符串或空数组。在他们自己的单元测试中测试他们。
最后,我会问为什么nil是handleString的有效输入。nil不是字符串。这应该是一个错误,除非有充分的理由,否则,您应该测试该错误。
https://stackoverflow.com/questions/71533100
复制相似问题