Golang Fuzzing测试

Golang fuzzing test

Posted by alovn on March 8, 2022

简介

Fuzzing 是一种自动化测试,它不断地操纵程序的输入以查找错误。它用半随机的数据可以测试出代码中潜在的bug。可以弥补遗漏的单元测试、发现易被忽视的边界输入的情况。因此fuzzy测试对于发现安全漏洞和漏洞特别有价值。Go1.18版本开始支持fuzzy测试。

下面是一个fuzz的测试示例,并标识了它的主要组成部分:

golang-fuzz-test-example

fuzz tests

必要条件

下面是写一个fuzz测试的规则:

  • fuzz测试的函数名必须为FuzzXXX,该函数只接收一个*testing.F参数,并且没有返回值。
  • fuzz测试必须在*_test.go文件中才可以运行。
  • fuzz target必须通过(testing.F).Fuzz函数调用,并且接受的第一个参数必须是testing.T,然后是fuzz测试的参数,调用没有返回值。
  • 每个fuzz测试必须有一个fuzz目标。
  • 调用f.Add函数参数需要跟fuzzing的参数类型和顺序一致。
  • fuzz参数必须是以下的类型:

    • string, []byte
    • int, int8, int16, int32/rune, int64
    • uint, uint8/byte, uint16, uint32, uint64
    • float32, float64
    • bool

运行

Fuzz测试是并行无序运行的。

执行fuzzing, 需要在运行go test时使用-fuzz参数:

1
go test -fuzz=FuzzTestName

-fuzz参数支持正则表达式以匹配多个。

注意使用fuzzing需要Go版本至少为Go1.18, 安装方式:

1
2
3
go install golang.org/dl/go1.18beta2@latest
go1.18beta2 download
go1.18beta2 test -fuzz=FuzzTestName

Fuzzing测试若没有异常,默认会一直执行下去。可以通过添加-fuzztime参数或者使用Ctrl+C终止执行。

参考文档

更详细的资料可以查看官方文档: