Skip to content

Commit

Permalink
feat: fuzz gnovm/pkg/transpiler.Transpile
Browse files Browse the repository at this point in the history
Adds a fuzzer for Transpile, which found bugs:
* gnolang#3425
* gnolang#3426
* partially gnolang#3428

Updates gnolang#3087
  • Loading branch information
odeke-em committed Jan 8, 2025
1 parent 27073ec commit 6eeae78
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 0 deletions.
81 changes: 81 additions & 0 deletions gnovm/pkg/transpiler/fuzz_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package transpiler

import (
"fmt"
"io"
"io/fs"
"os"
"path/filepath"
"runtime"
"strings"
"testing"
"time"
)

func FuzzTranspiling(f *testing.F) {
if testing.Short() {
f.Skip("Running in -short mode")
}

// 1. Derive the seeds from our seedGnoFiles.
breakRoot := filepath.Join("gnolang", "gno")
_, thisFile, _, _ := runtime.Caller(0)
index := strings.Index(thisFile, breakRoot)
rootPath := thisFile[:index+len(breakRoot)]
examplesDir := filepath.Join(rootPath, "examples")
ffs := os.DirFS(examplesDir)
seedGnoFiles := make([]string, 0, 100)
fs.WalkDir(ffs, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
panic(err)
}
if !strings.HasSuffix(path, ".gno") {
return nil
}
seedGnoFiles = append(seedGnoFiles, filepath.Join(examplesDir, path))
file, err := ffs.Open(path)
if err != nil {
panic(err)
}
blob, err := io.ReadAll(file)
file.Close()
if err != nil {
panic(err)
}
f.Add(blob)
return nil
})

// 2. Run the fuzzers.
f.Fuzz(func(t *testing.T, gnoSourceCode []byte) {
// 3. Add timings to ensure that if transpiling takes a long time
// to run, that we report this as problematic.
doneCh := make(chan bool, 1)
readyCh := make(chan bool)
go func() {
defer func() {
r := recover()
if r == nil {
return
}

sr := fmt.Sprintf("%s", r)
if !strings.Contains(sr, "invalid line number ") {
panic(r)
}
}()
close(readyCh)
defer close(doneCh)
_, _ = Transpile(string(gnoSourceCode), "gno", "in.gno")
doneCh <- true
}()

<-readyCh

select {
case <-time.After(2 * time.Second):
t.Fatalf("took more than 2 seconds to transpile\n\n%s", gnoSourceCode)
case <-doneCh:
}
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("package\tA\nimport(\"\"//\"\n\"\"/***/)")
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("package A\nimport(\"\"//\"\n\"\"/***/)")
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("package A\ncon\x12\n\xec|b\x80\xddQst(\n/*\n\n\n\n\n\n\nka\n*/A)")
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("//\"\npackage\tA\nimport(\"\"//\"\n\"\"/***/)")
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("//0000\x170000000000:0\npackage A")

0 comments on commit 6eeae78

Please sign in to comment.