diff options
| author | Siddharth M <siddharth.muralee@gmail.com> | 2019-07-17 15:28:23 +0530 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2019-07-17 11:58:23 +0200 |
| commit | f613a7c41d0b3ea16eeaad515e44dec003688ffb (patch) | |
| tree | 5ee7c4e7ce4539636f078c2add6b981df8c01203 /pkg | |
| parent | 0d10349cf0b4a9f98490378709bd9a83bd0042d6 (diff) | |
pkg/cover: fix prefix computation
* pkg/cover: Modify parsing logic
1. Remove prefix computation
2. Add a mgrconfig for kernel build directory
* pkg/report: shorten reports with kernelBuildSrc instead of kernelSrc
* pkg/report: Fix failing tests
* pkg/report: fix formating issues
* tools/syz-cover: Fix unintended redefinition
* make changes to fix failing ci build
* pkg/report: fix issues
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/cover/report.go | 57 | ||||
| -rw-r--r-- | pkg/mgrconfig/config.go | 2 | ||||
| -rw-r--r-- | pkg/mgrconfig/load.go | 3 | ||||
| -rw-r--r-- | pkg/report/akaros.go | 2 | ||||
| -rw-r--r-- | pkg/report/freebsd.go | 14 | ||||
| -rw-r--r-- | pkg/report/fuchsia.go | 2 | ||||
| -rw-r--r-- | pkg/report/gvisor.go | 2 | ||||
| -rw-r--r-- | pkg/report/linux.go | 44 | ||||
| -rw-r--r-- | pkg/report/netbsd.go | 26 | ||||
| -rw-r--r-- | pkg/report/netbsd_test.go | 9 | ||||
| -rw-r--r-- | pkg/report/openbsd.go | 26 | ||||
| -rw-r--r-- | pkg/report/openbsd_test.go | 9 | ||||
| -rw-r--r-- | pkg/report/report.go | 4 | ||||
| -rw-r--r-- | pkg/report/stub.go | 2 |
14 files changed, 86 insertions, 116 deletions
diff --git a/pkg/cover/report.go b/pkg/cover/report.go index a85b091d6..1b182b73a 100644 --- a/pkg/cover/report.go +++ b/pkg/cover/report.go @@ -23,6 +23,7 @@ import ( type ReportGenerator struct { vmlinux string srcDir string + buildDir string arch string symbols []symbol coverPCs []uint64 @@ -39,11 +40,12 @@ type coverage struct { covered bool } -func MakeReportGenerator(vmlinux, srcDir, arch string) (*ReportGenerator, error) { +func MakeReportGenerator(vmlinux, srcDir, buildDir, arch string) (*ReportGenerator, error) { rg := &ReportGenerator{ - vmlinux: vmlinux, - srcDir: srcDir, - arch: arch, + vmlinux: vmlinux, + srcDir: srcDir, + buildDir: buildDir, + arch: arch, } if err := rg.readSymbols(); err != nil { return nil, err @@ -61,7 +63,7 @@ func (rg *ReportGenerator) Do(w io.Writer, pcs []uint64) error { for i, pc := range pcs { pcs[i] = PreviousInstructionPC(rg.arch, pc) } - covered, prefix, err := rg.symbolize(pcs) + covered, err := rg.symbolize(pcs) if err != nil { return err } @@ -69,23 +71,25 @@ func (rg *ReportGenerator) Do(w io.Writer, pcs []uint64) error { return fmt.Errorf("'%s' does not have debug info (set CONFIG_DEBUG_INFO=y)", rg.vmlinux) } uncoveredPCs := rg.uncoveredPcsInFuncs(pcs) - uncovered, prefix2, err := rg.symbolize(uncoveredPCs) + uncovered, err := rg.symbolize(uncoveredPCs) if err != nil { return err } - if len(uncoveredPCs) != 0 { - prefix = combinePrefix(prefix, prefix2) - } - return rg.generate(w, prefix, covered, uncovered) + return rg.generate(w, covered, uncovered) } -func (rg *ReportGenerator) generate(w io.Writer, prefix string, covered, uncovered []symbolizer.Frame) error { +func (rg *ReportGenerator) generate(w io.Writer, covered, uncovered []symbolizer.Frame) error { var d templateData for f, covered := range fileSet(covered, uncovered) { - remain := filepath.Clean(strings.TrimPrefix(f, prefix)) - if rg.srcDir != "" && !strings.HasPrefix(remain, rg.srcDir) { - f = filepath.Join(rg.srcDir, remain) + if !strings.HasPrefix(f, rg.buildDir) { + return fmt.Errorf("path '%s' doesn't match build dir '%s'", f, rg.buildDir) } + + // Trim the existing build dir + remain := filepath.Clean(strings.TrimPrefix(f, rg.buildDir)) + + // Add the current kernel source dir + f = filepath.Join(rg.srcDir, remain) lines, err := parseFile(f) if err != nil { return err @@ -219,39 +223,20 @@ func (rg *ReportGenerator) uncoveredPcsInFuncs(pcs []uint64) []uint64 { return uncoveredPCs } -func (rg *ReportGenerator) symbolize(pcs []uint64) ([]symbolizer.Frame, string, error) { +func (rg *ReportGenerator) symbolize(pcs []uint64) ([]symbolizer.Frame, error) { symb := symbolizer.NewSymbolizer() defer symb.Close() frames, err := symb.SymbolizeArray(rg.vmlinux, pcs) if err != nil { - return nil, "", err + return nil, err } - prefix := "" for i := range frames { frame := &frames[i] frame.PC-- - if prefix == "" { - prefix = frame.File - } else { - prefix = combinePrefix(prefix, frame.File) - if prefix == "" { - break - } - } - } - return frames, prefix, nil -} - -func combinePrefix(prefix, prefix2 string) string { - i := 0 - for ; i < len(prefix) && i < len(prefix2); i++ { - if prefix[i] != prefix2[i] { - break - } } - return prefix[:i] + return frames, nil } func parseFile(fn string) ([][]byte, error) { diff --git a/pkg/mgrconfig/config.go b/pkg/mgrconfig/config.go index 48609d5c4..a023803ef 100644 --- a/pkg/mgrconfig/config.go +++ b/pkg/mgrconfig/config.go @@ -24,6 +24,8 @@ type Config struct { KernelObj string `json:"kernel_obj"` // Kernel source directory (if not set defaults to KernelObj). KernelSrc string `json:"kernel_src,omitempty"` + // Location of the driectory where the kernel was built (if not set defaults to KernelSrc) + KernelBuildSrc string `json:"kernel_build_src"` // Arbitrary optional tag that is saved along with crash reports (e.g. branch/commit). Tag string `json:"tag,omitempty"` // Location of the disk image file. diff --git a/pkg/mgrconfig/load.go b/pkg/mgrconfig/load.go index 1fdcc0155..a4cbc8914 100644 --- a/pkg/mgrconfig/load.go +++ b/pkg/mgrconfig/load.go @@ -111,6 +111,9 @@ func Complete(cfg *Config) error { cfg.KernelSrc = cfg.KernelObj // assume in-tree build by default } cfg.KernelSrc = osutil.Abs(cfg.KernelSrc) + if cfg.KernelBuildSrc == "" { + cfg.KernelBuildSrc = cfg.KernelSrc + } if cfg.HubClient != "" && (cfg.Name == "" || cfg.HubAddr == "" || cfg.HubKey == "") { return fmt.Errorf("hub_client is set, but name/hub_addr/hub_key is empty") } diff --git a/pkg/report/akaros.go b/pkg/report/akaros.go index 1aec59cfc..602bdd829 100644 --- a/pkg/report/akaros.go +++ b/pkg/report/akaros.go @@ -21,7 +21,7 @@ type akaros struct { objfile string } -func ctorAkaros(target *targets.Target, kernelSrc, kernelObj string, +func ctorAkaros(target *targets.Target, kernelSrc, kernelBuildSrc, kernelObj string, ignores []*regexp.Regexp) (Reporter, []string, error) { ctx := &akaros{ ignores: ignores, diff --git a/pkg/report/freebsd.go b/pkg/report/freebsd.go index b07e942db..1ca0b44be 100644 --- a/pkg/report/freebsd.go +++ b/pkg/report/freebsd.go @@ -11,17 +11,17 @@ import ( ) type freebsd struct { - kernelSrc string - kernelObj string - ignores []*regexp.Regexp + kernelBuildSrc string + kernelObj string + ignores []*regexp.Regexp } -func ctorFreebsd(target *targets.Target, kernelSrc, kernelObj string, +func ctorFreebsd(target *targets.Target, kernelSrc, kernelBuildSrc, kernelObj string, ignores []*regexp.Regexp) (Reporter, []string, error) { ctx := &freebsd{ - kernelSrc: kernelSrc, - kernelObj: kernelObj, - ignores: ignores, + kernelBuildSrc: kernelBuildSrc, + kernelObj: kernelObj, + ignores: ignores, } return ctx, nil, nil } diff --git a/pkg/report/fuchsia.go b/pkg/report/fuchsia.go index b7399cc5c..b8467d5e1 100644 --- a/pkg/report/fuchsia.go +++ b/pkg/report/fuchsia.go @@ -39,7 +39,7 @@ var ( } ) -func ctorFuchsia(target *targets.Target, kernelSrc, kernelObj string, +func ctorFuchsia(target *targets.Target, kernelSrc, kernelBuildSrc, kernelObj string, ignores []*regexp.Regexp) (Reporter, []string, error) { ctx := &fuchsia{ ignores: ignores, diff --git a/pkg/report/gvisor.go b/pkg/report/gvisor.go index aa5308f5d..8e24430c0 100644 --- a/pkg/report/gvisor.go +++ b/pkg/report/gvisor.go @@ -14,7 +14,7 @@ type gvisor struct { ignores []*regexp.Regexp } -func ctorGvisor(target *targets.Target, kernelSrc, kernelObj string, +func ctorGvisor(target *targets.Target, kernelSrc, kernelBuildSrc, kernelObj string, ignores []*regexp.Regexp) (Reporter, []string, error) { ctx := &gvisor{ ignores: ignores, diff --git a/pkg/report/linux.go b/pkg/report/linux.go index fb12b5509..b9145566b 100644 --- a/pkg/report/linux.go +++ b/pkg/report/linux.go @@ -21,6 +21,7 @@ import ( type linux struct { kernelSrc string + kernelBuildSrc string kernelObj string vmlinux string symbols map[string][]symbolizer.Symbol @@ -35,7 +36,7 @@ type linux struct { eoi []byte } -func ctorLinux(target *targets.Target, kernelSrc, kernelObj string, ignores []*regexp.Regexp) (Reporter, []string, error) { +func ctorLinux(target *targets.Target, kernelSrc, kernelBuildSrc, kernelObj string, ignores []*regexp.Regexp) (Reporter, []string, error) { var symbols map[string][]symbolizer.Symbol vmlinux := "" if kernelObj != "" { @@ -47,11 +48,12 @@ func ctorLinux(target *targets.Target, kernelSrc, kernelObj string, ignores []*r } } ctx := &linux{ - kernelSrc: kernelSrc, - kernelObj: kernelObj, - vmlinux: vmlinux, - symbols: symbols, - ignores: ignores, + kernelSrc: kernelSrc, + kernelBuildSrc: kernelBuildSrc, + kernelObj: kernelObj, + vmlinux: vmlinux, + symbols: symbols, + ignores: ignores, } ctx.consoleOutputRe = regexp.MustCompile(`^(?:\*\* [0-9]+ printk messages dropped \*\* )?(?:.* login: )?(?:\<[0-9]+\>)?\[ *[0-9]+\.[0-9]+\](\[ *(?:C|T)[0-9]+\])? `) ctx.questionableRes = []*regexp.Regexp{ @@ -335,14 +337,13 @@ func (ctx *linux) Symbolize(rep *Report) error { func (ctx *linux) symbolize(rep *Report) error { symb := symbolizer.NewSymbolizer() defer symb.Close() - strip := ctx.stripPrefix(symb) var symbolized []byte s := bufio.NewScanner(bytes.NewReader(rep.Report)) prefix := rep.reportPrefixLen for s.Scan() { line := append([]byte{}, s.Bytes()...) line = append(line, '\n') - newLine := symbolizeLine(symb.Symbolize, ctx.symbols, ctx.vmlinux, strip, line) + newLine := symbolizeLine(symb.Symbolize, ctx.symbols, ctx.vmlinux, ctx.kernelBuildSrc, line) if prefix > len(symbolized) { prefix += len(newLine) - len(line) } @@ -353,33 +354,6 @@ func (ctx *linux) symbolize(rep *Report) error { return nil } -func (ctx *linux) stripPrefix(symb *symbolizer.Symbolizer) string { - // Vmlinux may have been moved, so check if we can find debug info - // for some known functions and infer correct strip prefix from it. - knownSymbols := []struct { - symbol string - file string - }{ - {"__sanitizer_cov_trace_pc", "kernel/kcov.c"}, - {"__asan_load1", "mm/kasan/kasan.c"}, - {"start_kernel", "init/main.c"}, - } - for _, s := range knownSymbols { - for _, covSymb := range ctx.symbols[s.symbol] { - frames, _ := symb.Symbolize(ctx.vmlinux, covSymb.Addr) - if len(frames) > 0 { - file := frames[len(frames)-1].File - if idx := strings.Index(file, s.file); idx != -1 { - return file[:idx] - } - } - } - } - // Strip vmlinux location from all paths. - strip, _ := filepath.Abs(ctx.vmlinux) - return filepath.Dir(strip) + string(filepath.Separator) -} - func symbolizeLine(symbFunc func(bin string, pc uint64) ([]symbolizer.Frame, error), symbols map[string][]symbolizer.Symbol, vmlinux, strip string, line []byte) []byte { match := linuxSymbolizeRe.FindSubmatchIndex(line) diff --git a/pkg/report/netbsd.go b/pkg/report/netbsd.go index 8a24b0eb1..c716d6df0 100644 --- a/pkg/report/netbsd.go +++ b/pkg/report/netbsd.go @@ -17,11 +17,12 @@ import ( ) type netbsd struct { - kernelSrc string - kernelObj string - kernelObject string - symbols map[string][]symbolizer.Symbol - ignores []*regexp.Regexp + kernelSrc string + kernelBuildSrc string + kernelObj string + kernelObject string + symbols map[string][]symbolizer.Symbol + ignores []*regexp.Regexp } var ( @@ -33,7 +34,7 @@ var ( } ) -func ctorNetbsd(target *targets.Target, kernelSrc, kernelObj string, +func ctorNetbsd(target *targets.Target, kernelSrc, kernelBuildSrc, kernelObj string, ignores []*regexp.Regexp) (Reporter, []string, error) { var symbols map[string][]symbolizer.Symbol ignores = append(ignores, regexp.MustCompile("event_init: unable to initialize")) // postfix output @@ -47,11 +48,12 @@ func ctorNetbsd(target *targets.Target, kernelSrc, kernelObj string, } } ctx := &netbsd{ - kernelSrc: kernelSrc, - kernelObj: kernelObj, - kernelObject: kernelObject, - symbols: symbols, - ignores: ignores, + kernelSrc: kernelSrc, + kernelBuildSrc: kernelBuildSrc, + kernelObj: kernelObj, + kernelObject: kernelObject, + symbols: symbols, + ignores: ignores, } return ctx, nil, nil } @@ -134,7 +136,7 @@ func (ctx *netbsd) symbolizeLine(symbFunc func(bin string, pc uint64) ([]symboli // and line numbers. for _, frame := range frames { file := frame.File - file = strings.TrimPrefix(file, ctx.kernelSrc) + file = strings.TrimPrefix(file, ctx.kernelBuildSrc) file = strings.TrimPrefix(file, "/") info := fmt.Sprintf(" %v:%v", file, frame.Line) modified := append([]byte{}, line...) diff --git a/pkg/report/netbsd_test.go b/pkg/report/netbsd_test.go index 1fec41ab0..be5e69130 100644 --- a/pkg/report/netbsd_test.go +++ b/pkg/report/netbsd_test.go @@ -82,10 +82,11 @@ func TestNetbsdSymbolizeLine(t *testing.T) { } } nbsd := netbsd{ - kernelSrc: "netbsd/src", - kernelObj: "/netbsd/src/obj/sys/arch/amd64/compile/GENERIC", - kernelObject: "netbsd.gdb", - symbols: symbols, + kernelSrc: "netbsd/src", + kernelBuildSrc: "netbsd/src", + kernelObj: "/netbsd/src/obj/sys/arch/amd64/compile/GENERIC", + kernelObject: "netbsd.gdb", + symbols: symbols, } for i, test := range tests { t.Run(fmt.Sprint(i), func(t *testing.T) { diff --git a/pkg/report/openbsd.go b/pkg/report/openbsd.go index 4bd47f865..7a0c318a5 100644 --- a/pkg/report/openbsd.go +++ b/pkg/report/openbsd.go @@ -17,11 +17,12 @@ import ( ) type openbsd struct { - kernelSrc string - kernelObj string - kernelObject string - symbols map[string][]symbolizer.Symbol - ignores []*regexp.Regexp + kernelSrc string + kernelBuildSrc string + kernelObj string + kernelObject string + symbols map[string][]symbolizer.Symbol + ignores []*regexp.Regexp } var ( @@ -33,7 +34,7 @@ var ( } ) -func ctorOpenbsd(target *targets.Target, kernelSrc, kernelObj string, +func ctorOpenbsd(target *targets.Target, kernelSrc, kernelBuildSrc, kernelObj string, ignores []*regexp.Regexp) (Reporter, []string, error) { var symbols map[string][]symbolizer.Symbol kernelObject := "" @@ -46,11 +47,12 @@ func ctorOpenbsd(target *targets.Target, kernelSrc, kernelObj string, } } ctx := &openbsd{ - kernelSrc: kernelSrc, - kernelObj: kernelObj, - kernelObject: kernelObject, - symbols: symbols, - ignores: ignores, + kernelSrc: kernelSrc, + kernelBuildSrc: kernelBuildSrc, + kernelObj: kernelObj, + kernelObject: kernelObject, + symbols: symbols, + ignores: ignores, } return ctx, nil, nil } @@ -124,7 +126,7 @@ func (ctx *openbsd) symbolizeLine(symbFunc func(bin string, pc uint64) ([]symbol var symbolized []byte for _, frame := range frames { file := frame.File - file = strings.TrimPrefix(file, ctx.kernelSrc) + file = strings.TrimPrefix(file, ctx.kernelBuildSrc) file = strings.TrimPrefix(file, "/") info := fmt.Sprintf(" %v:%v", file, frame.Line) modified := append([]byte{}, line...) diff --git a/pkg/report/openbsd_test.go b/pkg/report/openbsd_test.go index e8fc7dfe3..a4b3acfb1 100644 --- a/pkg/report/openbsd_test.go +++ b/pkg/report/openbsd_test.go @@ -82,10 +82,11 @@ func TestOpenbsdSymbolizeLine(t *testing.T) { } } obsd := openbsd{ - kernelSrc: "/usr/src", - kernelObj: "/usr/src/sys/arch/amd64/compile/SYZKALLER/obj", - kernelObject: "bsd.gdb", - symbols: symbols, + kernelSrc: "/usr/src", + kernelBuildSrc: "/usr/src", + kernelObj: "/usr/src/sys/arch/amd64/compile/SYZKALLER/obj", + kernelObject: "bsd.gdb", + symbols: symbols, } for i, test := range tests { t.Run(fmt.Sprint(i), func(t *testing.T) { diff --git a/pkg/report/report.go b/pkg/report/report.go index ffed1578e..69b604e2b 100644 --- a/pkg/report/report.go +++ b/pkg/report/report.go @@ -98,7 +98,7 @@ func NewReporter(cfg *mgrconfig.Config) (Reporter, error) { if target == nil && typ != "gvisor" { return nil, fmt.Errorf("unknown target %v/%v", cfg.TargetOS, cfg.TargetArch) } - rep, suppressions, err := ctor(target, cfg.KernelSrc, cfg.KernelObj, ignores) + rep, suppressions, err := ctor(target, cfg.KernelSrc, cfg.KernelBuildSrc, cfg.KernelObj, ignores) if err != nil { return nil, err } @@ -125,7 +125,7 @@ var ctors = map[string]fn{ "windows": ctorStub, } -type fn func(*targets.Target, string, string, []*regexp.Regexp) (Reporter, []string, error) +type fn func(*targets.Target, string, string, string, []*regexp.Regexp) (Reporter, []string, error) func compileRegexps(list []string) ([]*regexp.Regexp, error) { compiled := make([]*regexp.Regexp, len(list)) diff --git a/pkg/report/stub.go b/pkg/report/stub.go index e7f581c08..ba6d20c2e 100644 --- a/pkg/report/stub.go +++ b/pkg/report/stub.go @@ -15,7 +15,7 @@ type stub struct { ignores []*regexp.Regexp } -func ctorStub(target *targets.Target, kernelSrc, kernelObj string, +func ctorStub(target *targets.Target, kernelSrc, kernelBuildSrc, kernelObj string, ignores []*regexp.Regexp) (Reporter, []string, error) { ctx := &stub{ kernelSrc: kernelSrc, |
