feature. See also
. The project being documented here (as the example) is the Zig library itself.
Fuzz.waitAndPrintReport
pub fn waitAndPrintReport(fuzz: *Fuzz) Io.Cancelable!void
File
Code
pub fn waitAndPrintReport(fuzz: *Fuzz) Io.Cancelable!void {
assert(fuzz.mode == .limit);
const maker = fuzz.maker;
const graph = maker.graph;
const io = graph.io;
const cache_root = graph.local_cache_root;
const conf = &maker.scanned_config.configuration;
try fuzz.group.await(io);
fuzz.group = .init;
std.debug.print("======= FUZZING REPORT =======\n", .{});
for (fuzz.msg_queue.items) |msg| {
if (msg != .coverage) continue;
const cov = msg.coverage;
const run_step_name = cov.run.ptr(conf).name.slice(conf);
const run = &maker.stepByIndex(cov.run).extended.run;
const coverage_file_path: std.Build.Cache.Path = .{
.root_dir = cache_root,
.sub_path = "v/" ++ std.fmt.hex(cov.id),
};
var coverage_file = coverage_file_path.root_dir.handle.openFile(io, coverage_file_path.sub_path, .{}) catch |err| {
fatal("step {s}: failed to load coverage file {f}: {t}", .{
run_step_name, coverage_file_path, err,
});
};
defer coverage_file.close(io);
const fuzz_abi = std.Build.abi.fuzz;
var rbuf: [0x1000]u8 = undefined;
var r = coverage_file.reader(io, &rbuf);
var header: fuzz_abi.SeenPcsHeader = undefined;
r.interface.readSliceAll(std.mem.asBytes(&header)) catch |err| {
fatal("step {s}: failed to read from coverage file {f}: {t}", .{
run_step_name, coverage_file_path, err,
});
};
if (header.pcs_len == 0) {
fatal("step {s}: corrupted coverage file {f}: pcs_len was zero", .{
run_step_name, coverage_file_path,
});
}
var seen_count: usize = 0;
const chunk_count = fuzz_abi.SeenPcsHeader.seenElemsLen(header.pcs_len);
for (0..chunk_count) |_| {
const seen = r.interface.takeInt(usize, .little) catch |err| {
fatal("step {s}: failed to read from coverage file {f}: {t}", .{
run_step_name, coverage_file_path, err,
});
};
seen_count += @popCount(seen);
}
const seen_f: f64 = @floatFromInt(seen_count);
const total_f: f64 = @floatFromInt(header.pcs_len);
const ratio = seen_f / total_f;
std.debug.print(
\\Step: {s}
\\Fuzz test: "{s}" ({x})
\\Runs: {} -> {}
\\Unique runs: {} -> {}
\\Coverage: {}/{} -> {}/{} ({:.02}%)
\\
, .{
run_step_name,
run.fuzz_tests.items[0],
cov.id,
cov.cumulative.runs,
header.n_runs,
cov.cumulative.unique,
header.unique_runs,
cov.cumulative.coverage,
header.pcs_len,
seen_count,
header.pcs_len,
ratio * 100,
});
std.debug.print("------------------------------\n", .{});
}
std.debug.print(
\\Values are accumulated across multiple runs when preserving the cache.
\\==============================
\\
, .{});
}