aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/ipc
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2022-03-23 13:50:36 +0000
committerAleksandr Nogikh <wp32pw@gmail.com>2022-03-28 12:03:35 +0200
commitcdcc8b96dd9215a47ce5ce1074567a1be93eda5f (patch)
tree943129722632f399ee55e1245f7c10eaf98a5f8a /pkg/ipc
parentfc79262e5b62a97a2338b247a1c31ee1c79decc2 (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.go22
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 {