authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-07-29 21:59:23-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-08-07 00:48:32-07:00
logffc050e0557c5d951cd293ca365ed0cd3cdf83db
tree12e2af9ff70db2eb850e65b5f35bf5535b996e5b
parent97643c1ecc9621b088807f446f06fe51e2db8fb6

fuzzer: log errors and move deduplicated runs to shared mem


1 files changed, 5 insertions(+), 8 deletions(-)

lib/fuzzer.zig+5-8
......@@ -16,7 +16,6 @@ fn logOverride(
1616 comptime format: []const u8,
1717 args: anytype,
1818) void {
19 if (builtin.mode != .Debug) return;
2019 const f = if (log_file) |f| f else f: {
2120 const f = fuzzer.dir.createFile("libfuzzer.log", .{}) catch @panic("failed to open fuzzer log file");
2221 log_file = f;
......@@ -27,7 +26,7 @@ fn logOverride(
2726 f.writer().print(prefix1 ++ prefix2 ++ format ++ "\n", args) catch @panic("failed to write to fuzzer log");
2827}
2928
30export threadlocal var __sancov_lowest_stack: usize = 0;
29export threadlocal var __sancov_lowest_stack: usize = std.math.maxInt(usize);
3130
3231var module_count_8bc: usize = 0;
3332var module_count_pcs: usize = 0;
......@@ -108,7 +107,6 @@ const Fuzzer = struct {
108107 pc_counters: []u8,
109108 n_runs: usize,
110109 recent_cases: RunMap,
111 deduplicated_runs: usize,
112110 /// Data collected from code coverage instrumentation from one execution of
113111 /// the test function.
114112 coverage: Coverage,
......@@ -120,6 +118,7 @@ const Fuzzer = struct {
120118
121119 const SeenPcsHeader = extern struct {
122120 n_runs: usize,
121 deduplicated_runs: usize,
123122 pcs_len: usize,
124123 lowest_stack: usize,
125124 };
......@@ -229,6 +228,7 @@ const Fuzzer = struct {
229228 } else {
230229 const header: SeenPcsHeader = .{
231230 .n_runs = 0,
231 .deduplicated_runs = 0,
232232 .pcs_len = flagged_pcs.len,
233233 .lowest_stack = std.math.maxInt(usize),
234234 };
......@@ -273,7 +273,8 @@ const Fuzzer = struct {
273273 });
274274 if (gop.found_existing) {
275275 //std.log.info("duplicate analysis: score={d} id={d}", .{ analysis.score, analysis.id });
276 f.deduplicated_runs += 1;
276 const header: *volatile SeenPcsHeader = @ptrCast(f.seen_pcs.items[0..@sizeOf(SeenPcsHeader)]);
277 _ = @atomicRmw(usize, &header.deduplicated_runs, .Add, 1, .monotonic);
277278 if (f.input.items.len < gop.key_ptr.input.len or gop.key_ptr.score == 0) {
278279 gpa.free(gop.key_ptr.input);
279280 gop.key_ptr.input = try gpa.dupe(u8, f.input.items);
......@@ -348,9 +349,6 @@ const Fuzzer = struct {
348349 }
349350
350351 fn dumpStats(f: *Fuzzer) void {
351 std.log.info("stats: runs={d} deduplicated={d}", .{
352 f.n_runs, f.deduplicated_runs,
353 });
354352 for (f.recent_cases.keys()[0..@min(f.recent_cases.entries.len, 5)], 0..) |run, i| {
355353 std.log.info("best[{d}] id={x} score={d} input: '{}'", .{
356354 i, run.id, run.score, std.zig.fmtEscapes(run.input),
......@@ -397,7 +395,6 @@ var fuzzer: Fuzzer = .{
397395 .flagged_pcs = undefined,
398396 .pc_counters = undefined,
399397 .n_runs = 0,
400 .deduplicated_runs = 0,
401398 .recent_cases = .{},
402399 .coverage = undefined,
403400 .dir = undefined,