From cdcc8b96dd9215a47ce5ce1074567a1be93eda5f Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Wed, 23 Mar 2022 13:50:36 +0000 Subject: all: collect raw coverage Raw coverage might be important when e.g. analysing the origins of out-of-place coverage in coverage reports or understanding why the fuzzer could not reach deeper code. If "raw_cover" is set to true, syzkaller will remember unsorted and unduplicated coverage (PCs) for each its corpus program. --- pkg/ipc/ipc.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'pkg/ipc') diff --git a/pkg/ipc/ipc.go b/pkg/ipc/ipc.go index 5bf4738ca..6b25d4af4 100644 --- a/pkg/ipc/ipc.go +++ b/pkg/ipc/ipc.go @@ -289,7 +289,7 @@ func (env *Env) Exec(opts *ExecOpts, p *prog.Prog) (output []byte, info *ProgInf return } - info, err0 = env.parseOutput(p) + info, err0 = env.parseOutput(p, opts) if info != nil && env.config.Flags&FlagSignal == 0 { addFallbackSignal(p, info) } @@ -323,7 +323,7 @@ func addFallbackSignal(p *prog.Prog, info *ProgInfo) { } } -func (env *Env) parseOutput(p *prog.Prog) (*ProgInfo, error) { +func (env *Env) parseOutput(p *prog.Prog, opts *ExecOpts) (*ProgInfo, error) { out := env.out ncmd, ok := readUint32(&out) if !ok { @@ -372,19 +372,27 @@ func (env *Env) parseOutput(p *prog.Prog) (*ProgInfo, error) { if len(extraParts) == 0 { return info, nil } - info.Extra = convertExtra(extraParts) + info.Extra = convertExtra(extraParts, opts.Flags&FlagDedupCover > 0) return info, nil } -func convertExtra(extraParts []CallInfo) CallInfo { +func convertExtra(extraParts []CallInfo, dedupCover bool) CallInfo { var extra CallInfo - extraCover := make(cover.Cover) + if dedupCover { + extraCover := make(cover.Cover) + for _, part := range extraParts { + extraCover.Merge(part.Cover) + } + extra.Cover = extraCover.Serialize() + } else { + for _, part := range extraParts { + extra.Cover = append(extra.Cover, part.Cover...) + } + } extraSignal := make(signal.Signal) for _, part := range extraParts { - extraCover.Merge(part.Cover) extraSignal.Merge(signal.FromRaw(part.Signal, 0)) } - extra.Cover = extraCover.Serialize() extra.Signal = make([]uint32, len(extraSignal)) i := 0 for s := range extraSignal { -- cgit mrf-deployment