diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2022-03-23 13:50:36 +0000 |
|---|---|---|
| committer | Aleksandr Nogikh <wp32pw@gmail.com> | 2022-03-28 12:03:35 +0200 |
| commit | cdcc8b96dd9215a47ce5ce1074567a1be93eda5f (patch) | |
| tree | 943129722632f399ee55e1245f7c10eaf98a5f8a /pkg/ipc | |
| parent | fc79262e5b62a97a2338b247a1c31ee1c79decc2 (diff) | |
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.
Diffstat (limited to 'pkg/ipc')
| -rw-r--r-- | pkg/ipc/ipc.go | 22 |
1 files changed, 15 insertions, 7 deletions
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 { |
