建议详情
我有两个模糊测试,它们测试相同的代码,但是其中一个接受二进制数据,而第二个接受字符串(我的代码有ASCII和二进制表示)。
我通过将表示形式转换来从另一个测试中找到新的问题。因此,我建议将其添加:
// Corpus let you fetch the corpus from an other test, callback will be called with all the entry in the other test corpus.
// source must be a function pointer to the actual other test.
// callback must be a function pointer which has the same signature as the other test [F.Add] argument.
// Corpus must not be called once [F.Fuzz] has been called.
func (*F) Corpus(source, callback any)
预期用法:
func FuzzString(f *testing.F) {
for _, v := range testcase {
_, err := decodeString(v)
if err != nil { f.Fatal(err) }
f.Add(v)
}
f.Corpus(FuzzBinary, func(_ *testing.T, b []byte) {
v, err := decodeBinary(b)
if err != nil { return }
str, err := v.String()
if err != nil { return }
f.Add(str)
})
f.Fuzz(func(_ *testing.T, s string) {
v, err := decodeString(s)
if err != nil { return }
testStuff(v)
})
}
func FuzzBinary(f *testing.F) {
for _, v := range testcase {
b, err := decodeString(v)
if err != nil { f.Fatal(err) }
f.Add(b)
}
f.Corpus(FuzzString, func(_ *testing.T, s string) {
v, err := decodeString(s)
if err != nil { return }
f.Add(v)
})
f.Fuzz(func(_ *testing.T, b []byte) {
v, err := decodeBinary(b)
if err != nil { return }
testStuff(v)
})
}
目前还不清楚 callback
是否应该保留,如果保留,我们可以并行运行多个模糊测试,并在运行过程中实时将一个的条目转换为另一个(这将需要一些棘手的同步和内部验证)。
我认为现在不需要这样做,但我们可以添加一条注解提示这可能是将来的事情。我认为这不会破坏任何人,因为目前无法同时运行多个模糊测试。
2条答案
按热度按时间hwazgwia1#
我认为获取自己的语料库也是合法的(尽管有点无意义)。
如果我们有10个相互连接的模糊测试,我们不需要10个 snowflake 获取转换。
我可以让一个单一的
corpus(*testing.F)
函数来获取并从所有10个测试中添加语料库。y3bcpkx12#
CC @golang/fuzzing