go 建议:测试:添加testing.F.Corpus以帮助跨测试转换,

juud5qan  于 6个月前  发布在  Go
关注(0)|答案(2)|浏览(44)

建议详情

我有两个模糊测试,它们测试相同的代码,但是其中一个接受二进制数据,而第二个接受字符串(我的代码有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 是否应该保留,如果保留,我们可以并行运行多个模糊测试,并在运行过程中实时将一个的条目转换为另一个(这将需要一些棘手的同步和内部验证)。
我认为现在不需要这样做,但我们可以添加一条注解提示这可能是将来的事情。我认为这不会破坏任何人,因为目前无法同时运行多个模糊测试。

hwazgwia

hwazgwia1#

我认为获取自己的语料库也是合法的(尽管有点无意义)。
如果我们有10个相互连接的模糊测试,我们不需要10个 snowflake 获取转换。
我可以让一个单一的 corpus(*testing.F) 函数来获取并从所有10个测试中添加语料库。

相关问题