fuzz.go 820 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. //go:build gofuzz
  2. // +build gofuzz
  3. package pattern
  4. import (
  5. "go/ast"
  6. goparser "go/parser"
  7. "go/token"
  8. "os"
  9. "path/filepath"
  10. "strings"
  11. )
  12. var files []*ast.File
  13. func init() {
  14. fset := token.NewFileSet()
  15. filepath.Walk("/usr/lib/go/src", func(path string, info os.FileInfo, err error) error {
  16. if err != nil {
  17. // XXX error handling
  18. panic(err)
  19. }
  20. if !strings.HasSuffix(path, ".go") {
  21. return nil
  22. }
  23. f, err := goparser.ParseFile(fset, path, nil, 0)
  24. if err != nil {
  25. return nil
  26. }
  27. files = append(files, f)
  28. return nil
  29. })
  30. }
  31. func Fuzz(data []byte) int {
  32. p := &Parser{}
  33. pat, err := p.Parse(string(data))
  34. if err != nil {
  35. if strings.Contains(err.Error(), "internal error") {
  36. panic(err)
  37. }
  38. return 0
  39. }
  40. _ = pat.Root.String()
  41. for _, f := range files {
  42. Match(pat.Root, f)
  43. }
  44. return 1
  45. }