Documentation
¶
Overview ¶
Package fuzzjudge decides, from the progress lines the Go fuzzer prints, whether a fuzz run stalled. `go test -fuzz` ends with PASS after a time limit whether or not anything ran in the last minutes, so scripts/fuzz.sh passes the log through cmd/fuzzjudge.
What it can see is the whole run's rate, not one input or one worker. It fails a run in which
- no execution happened for StallGap anywhere in the run, including at the end of the log; or
- the rate in the second half of the run (the median of the stretches that had executions) fell below MinRatio of the rate in the first half (after its first tenth, which is warm-up): a collapse to under a third; or
- the share of the second half that was idle (stretches between progress lines with no execution) is more than MaxIdleRise above the share of the first half's: a run that pauses in stretches of less than StallGap and runs at full rate between them has a healthy median rate and no stall, and is mostly idle.
It does not fail the pauses the fuzzer makes itself (12 to 18 seconds with no execution, seen in real runs), nor a stall of 30 seconds or less at the end, nor a rate that varies by a factor of two, nor the same pauses in both halves. A stall of one input in one of several workers leaves most of the rate, so it is the watchdog in scripts/fuzz/fuzz_test.go that stops an input that takes ten seconds, while it runs.
Index ¶
Constants ¶
const ( // StallGap is the time without an execution that is a stall. The fuzzer pauses // by itself for 12 to 18 seconds (seen in real runs), so it is more than that. StallGap = 30 * time.Second // MinRatio is the least rate of the second half of a run, as a part of the rate // of its first half. The rate of a real run varies by a factor of two from one // half to the other (the fuzzer pauses to minimise an input that found new // coverage), so only a collapse is a stall. MinRatio = 0.3 // MaxIdleRise is the most the share of idle time of the second half of a run may // exceed the first half's (a fraction of the half: 0.5 is 50 points). The fuzzer's // own pauses (12 to 18 seconds, seen in real runs) fall in either half, so only a // share far above the first half's is a stall. MaxIdleRise = 0.5 )
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Verdict ¶
type Verdict struct {
Execs int64
Elapsed time.Duration
FirstRate float64 // executions a second in the first half, after the first tenth
LastRate float64 // and in the second half
FirstIdle float64 // the share of the first half (after its first tenth) with no execution, from 0 to 1
LastIdle float64 // and of the second half
Problem string // empty when the run is sound
}
Verdict is the judgement of a run.