Clone this repo:
  1. 9eed411 Support fuzzing unexported fields (#63) by yanzhoupan · 2 years, 4 months ago main
  2. f78f29f Make the fuzzer threadsafe (#61) by Alvaro Aleman · 2 years, 5 months ago
  3. 2083bd8 Fix int overflow on 32 bits systems (#59) by Robert-André Mauchin · 2 years, 9 months ago
  4. e82a91a example_test: explicitly set keys in unicoderange (#55) by Rick Rackow · 3 years ago
  5. 5aecaa2 Fix testing methodology; passes accumulate now. (#53) by Daniel Smith · 3 years ago


gofuzz is a library for populating go objects with random values.

GoDoc Travis

This is useful for testing:

  • Do your project's objects really serialize/unserialize correctly in all cases?
  • Is there an incorrectly formatted object that will cause your project to panic?

Import with import ""

You can use it on single variables:

f := fuzz.New()
var myInt int
f.Fuzz(&myInt) // myInt gets a random value.

You can use it on maps:

f := fuzz.New().NilChance(0).NumElements(1, 1)
var myMap map[ComplexKeyType]string
f.Fuzz(&myMap) // myMap will have exactly one element.

Customize the chance of getting a nil pointer:

f := fuzz.New().NilChance(.5)
var fancyStruct struct {
  A, B, C, D *string
f.Fuzz(&fancyStruct) // About half the pointers should be set.

You can even customize the randomization completely if needed:

type MyEnum string
const (
        A MyEnum = "A"
        B MyEnum = "B"
type MyInfo struct {
        Type MyEnum
        AInfo *string
        BInfo *string

f := fuzz.New().NilChance(0).Funcs(
        func(e *MyInfo, c fuzz.Continue) {
                switch c.Intn(2) {
                case 0:
                        e.Type = A
                case 1:
                        e.Type = B

var myObject MyInfo
f.Fuzz(&myObject) // Type will correspond to whether A or B info is set.

See more examples in example_test.go.

You can use this library for easier go-fuzzing. go-fuzz provides the user a byte-slice, which should be converted to different inputs for the tested function. This library can help convert the byte slice. Consider for example a fuzz test for a the function mypackage.MyFunc that takes an int arguments:

// +build gofuzz
package mypackage

import fuzz ""

func Fuzz(data []byte) int {
        var i int
        return 0

Happy testing!