diff --git a/coverage_runner_template.txt b/coverage_runner_template.txt new file mode 100644 index 0000000..70e12a8 --- /dev/null +++ b/coverage_runner_template.txt @@ -0,0 +1,86 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mypackagebeingfuzzed + +import ( + "fmt" + "io/fs" + "io/ioutil" + "os" + "path/filepath" + "reflect" + "runtime/pprof" + "testing" + + "github.com/holiman/gofuzz-shim/input" +) + +func TestFuzzCorpus(t *testing.T) { + var ( + dir = os.Getenv("FUZZ_CORPUS_DIR") + profname = os.Getenv("FUZZ_PROFILE_NAME") + filename string + ) + if dir == "" { + t.Logf("No corpus-directory set") + return + } + _, err := ioutil.ReadDir(dir) + if err != nil { + t.Logf("Error reading corpus-directory ($FUZZ_CORPUS_DIR:%q): %v", dir, err) + return + } + if profname != "" { + f, err := os.Create(profname + ".cpu.prof") + if err != nil { + t.Logf("error creating profile file: %v\n", err) + } else { + _ = pprof.StartCPUProfile(f) + defer func() { + pprof.StopCPUProfile() + f, err := os.Create(profname + ".heap.prof") + if err != nil { + t.Logf("error creating heap profile file %s\n", err) + } + if err = pprof.WriteHeapProfile(f); err != nil { + t.Logf("error writing heap profile file %s\n", err) + } + f.Close() + }() + } + } + defer func() { + if r := recover(); r != nil { + t.Errorf("Fuzz panic in %v: %v", filename, r) + } + }() + // recurse for regressions subdirectory + err = filepath.Walk(dir, func(fname string, info fs.FileInfo, err error) error { + if info.IsDir() { + return nil + } + data, err := ioutil.ReadFile(fname) + if err != nil { + return fmt.Errorf("error reading corpusfile: %w", err) + } + filename = fname + src := input.NewSource(data) + src.FillAndCall(FuzzFunction, reflect.ValueOf(t)) + return nil + }) + if err != nil { + t.Errorf("Failed to run corpus: %v", err) + } +} diff --git a/oss-fuzz.sh b/oss-fuzz.sh index 5b37e70..79a404b 100644 --- a/oss-fuzz.sh +++ b/oss-fuzz.sh @@ -3,6 +3,8 @@ # This sets the -coverpgk for the coverage report when the corpus is executed through go test coverpkg="github.com/holiman/uint256/..." +(cd /src/ && git clone https://github.com/holiman/gofuzz-shim.git ) + function coverbuild { path=$1 function=$2 @@ -14,7 +16,7 @@ function coverbuild { fi cd $path fuzzed_package=`pwd | rev | cut -d'/' -f 1 | rev` - cp $GOPATH/ossfuzz_coverage_runner.go ./"${function,,}"_test.go + cp /src/gofuzz-shim/coverage_runner_template.txt ./"${function,,}"_test.go sed -i -e 's/FuzzFunction/'$function'/' ./"${function,,}"_test.go sed -i -e 's/mypackagebeingfuzzed/'$fuzzed_package'/' ./"${function,,}"_test.go sed -i -e 's/TestFuzzCorpus/Test'$function'Corpus/' ./"${function,,}"_test.go