| // Copyright 2017 syzkaller project authors. All rights reserved. |
| // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. |
| |
| package report |
| |
| import ( |
| "fmt" |
| |
| "github.com/google/syzkaller/pkg/mgrconfig" |
| ) |
| |
| func Fuzz(data []byte) int { |
| res := 0 |
| for _, reporter := range fuzzReporters { |
| typ := reporter.(*reporterWrapper).typ |
| containsCrash := reporter.ContainsCrash(data) |
| rep := reporter.Parse(data) |
| if containsCrash != (rep != nil) { |
| panic(fmt.Sprintf("%v: ContainsCrash and Parse disagree", typ)) |
| } |
| if rep == nil { |
| continue |
| } |
| res = 1 |
| reporter.Symbolize(rep) |
| if rep.Title == "" { |
| panic(fmt.Sprintf("%v: Title is empty", typ)) |
| } |
| if len(rep.Report) == 0 { |
| panic(fmt.Sprintf("%v: len(Report) == 0", typ)) |
| } |
| if len(rep.Output) == 0 { |
| panic(fmt.Sprintf("%v: len(Output) == 0", typ)) |
| } |
| if rep.StartPos != 0 && rep.EndPos != 0 && rep.StartPos >= rep.EndPos { |
| panic(fmt.Sprintf("%v: StartPos=%v >= EndPos=%v", typ, rep.StartPos, rep.EndPos)) |
| } |
| if rep.EndPos > len(rep.Output) { |
| panic(fmt.Sprintf("%v: EndPos=%v > len(Output)=%v", typ, rep.EndPos, len(rep.Output))) |
| } |
| } |
| return res |
| } |
| |
| var fuzzReporters = func() []Reporter { |
| var reporters []Reporter |
| for os := range ctors { |
| if os == "windows" { |
| continue |
| } |
| cfg := &mgrconfig.Config{ |
| TargetOS: os, |
| TargetArch: "amd64", |
| } |
| reporter, err := NewReporter(cfg) |
| if err != nil { |
| panic(err) |
| } |
| if _, ok := reporter.(*stub); ok { |
| continue |
| } |
| reporters = append(reporters, reporter) |
| } |
| return reporters |
| }() |