当我根据文档中的示例在Go中进行模糊测试时,我得到了这个错误。
错误日志
$ 去测试 -fuzz=Fuzz 警告:测试二进制文件不是使用覆盖率检测构建的,因此模糊测试将在没有覆盖率指导的情况下运行,并且可能效率低下 --- 失败:FuzzReverse(0.01s) 映射临时文件 C:\Users\use\AppData\Local\Temp uzz-2637883721:没有足够的内存资源可用于处理此命令。 失败 退出状态1 失败示例/模糊 0.031s
我的代码
package main
import (
"testing"
"unicode/utf8"
)
func FuzzReverse(f *testing.F) {
testcases := []string{"Hello, world", " ", "!12345"}
for _, tc := range testcases {
f.Add(tc) // Use f.Add to provide a 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)
}
})
}
和测试日志
$ 去测试一下
经过
好的示例/模糊 0.027s
$ 去版本 go版本go1.23.0 windows/386
我怀疑/怀疑你的
Reverse(orig)
函数返回错误,但你忽略它。如果您的函数返回如下错误:
func Reverse(s string) (string, error) {
if !utf8.ValidString(s) {
return s, errors.New("input is not valid UTF-8")
}
r := []rune(s)
for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r), nil
}
那么你的测试应该如下所示:
func FuzzReverse(f *testing.F) {
testcases := []string{"Hello, world", " ", "!12345"}
for _, tc := range testcases {
f.Add(tc) // Use f.Add to provide a seed corpus
}
f.Fuzz(func(t *testing.T, orig string) {
rev := Reverse(orig)
if err1 != nil {
t.Skip()
}
doubleRev, err2 := Reverse(rev)
if err2 != nil {
t.Skip()
}
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)
}
})
}
还要确保主包的文件夹可写,如果问题仍然存在,您可能需要清理缓存:
Running 'go clean -fuzzcache' removes all cached fuzzing values. This may make fuzzing less effective, temporarily.
我建议逐步完成doc,避免跳转/跳过某些步骤或只是复制代码而不阅读说明和解释,因为这对于避免此类未知错误很有用。 LMK 更多详细信息和/或分享您的完整代码,包括您正在测试的函数本身(模糊目标)。
PS:您可能会发现以下命令很有用:
go help testflag
go help testflag
您可能还会发现此链接很有用!