github.com/gopherd/gonum@v0.0.4/graph/formats/dot/fuzz/fuzz.go (about)

     1  // Copyright ©2019 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build gofuzz
     6  // +build gofuzz
     7  
     8  package fuzz
     9  
    10  import (
    11  	"bytes"
    12  	"os/exec"
    13  
    14  	"github.com/gopherd/gonum/graph/formats/dot"
    15  )
    16  
    17  // Fuzz implements the fuzzing function required for go-fuzz.
    18  //
    19  // See documentation at https://github.com/dvyukov/go-fuzz.
    20  func Fuzz(data []byte) int {
    21  	// We don't accept empty data; the dot command does.
    22  	if len(data) == 0 || bytes.Equal(data, []byte{0}) {
    23  		return -1
    24  	}
    25  
    26  	// Check that dot accepts the input without complaint.
    27  	cmd := exec.Command("dot")
    28  	cmd.Stdin = bytes.NewReader(data)
    29  	err := cmd.Run()
    30  	if err != nil {
    31  		return 0
    32  	}
    33  
    34  	// Try to parse the data.
    35  	_, err = dot.Parse(bytes.NewReader(data))
    36  	if err != nil {
    37  		panic("could not parse good dot")
    38  	}
    39  	return 1
    40  }