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(...@@ -16,7 +16,6 @@ fn logOverride(
16 comptime format: []const u8,16 comptime format: []const u8,
17 args: anytype,17 args: anytype,
18) void {18) void {
19 if (builtin.mode != .Debug) return;
20 const f = if (log_file) |f| f else f: {19 const f = if (log_file) |f| f else f: {
21 const f = fuzzer.dir.createFile("libfuzzer.log", .{}) catch @panic("failed to open fuzzer log file");20 const f = fuzzer.dir.createFile("libfuzzer.log", .{}) catch @panic("failed to open fuzzer log file");
22 log_file = f;21 log_file = f;
...@@ -27,7 +26,7 @@ fn logOverride(...@@ -27,7 +26,7 @@ fn logOverride(
27 f.writer().print(prefix1 ++ prefix2 ++ format ++ "\n", args) catch @panic("failed to write to fuzzer log");26 f.writer().print(prefix1 ++ prefix2 ++ format ++ "\n", args) catch @panic("failed to write to fuzzer log");
28}27}
2928
30export threadlocal var __sancov_lowest_stack: usize = 0;29export threadlocal var __sancov_lowest_stack: usize = std.math.maxInt(usize);
3130
32var module_count_8bc: usize = 0;31var module_count_8bc: usize = 0;
33var module_count_pcs: usize = 0;32var module_count_pcs: usize = 0;
...@@ -108,7 +107,6 @@ const Fuzzer = struct {...@@ -108,7 +107,6 @@ const Fuzzer = struct {
108 pc_counters: []u8,107 pc_counters: []u8,
109 n_runs: usize,108 n_runs: usize,
110 recent_cases: RunMap,109 recent_cases: RunMap,
111 deduplicated_runs: usize,
112 /// Data collected from code coverage instrumentation from one execution of110 /// Data collected from code coverage instrumentation from one execution of
113 /// the test function.111 /// the test function.
114 coverage: Coverage,112 coverage: Coverage,
...@@ -120,6 +118,7 @@ const Fuzzer = struct {...@@ -120,6 +118,7 @@ const Fuzzer = struct {
120118
121 const SeenPcsHeader = extern struct {119 const SeenPcsHeader = extern struct {
122 n_runs: usize,120 n_runs: usize,
121 deduplicated_runs: usize,
123 pcs_len: usize,122 pcs_len: usize,
124 lowest_stack: usize,123 lowest_stack: usize,
125 };124 };
...@@ -229,6 +228,7 @@ const Fuzzer = struct {...@@ -229,6 +228,7 @@ const Fuzzer = struct {
229 } else {228 } else {
230 const header: SeenPcsHeader = .{229 const header: SeenPcsHeader = .{
231 .n_runs = 0,230 .n_runs = 0,
231 .deduplicated_runs = 0,
232 .pcs_len = flagged_pcs.len,232 .pcs_len = flagged_pcs.len,
233 .lowest_stack = std.math.maxInt(usize),233 .lowest_stack = std.math.maxInt(usize),
234 };234 };
...@@ -273,7 +273,8 @@ const Fuzzer = struct {...@@ -273,7 +273,8 @@ const Fuzzer = struct {
273 });273 });
274 if (gop.found_existing) {274 if (gop.found_existing) {
275 //std.log.info("duplicate analysis: score={d} id={d}", .{ analysis.score, analysis.id });275 //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);
277 if (f.input.items.len < gop.key_ptr.input.len or gop.key_ptr.score == 0) {278 if (f.input.items.len < gop.key_ptr.input.len or gop.key_ptr.score == 0) {
278 gpa.free(gop.key_ptr.input);279 gpa.free(gop.key_ptr.input);
279 gop.key_ptr.input = try gpa.dupe(u8, f.input.items);280 gop.key_ptr.input = try gpa.dupe(u8, f.input.items);
...@@ -348,9 +349,6 @@ const Fuzzer = struct {...@@ -348,9 +349,6 @@ const Fuzzer = struct {
348 }349 }
349350
350 fn dumpStats(f: *Fuzzer) void {351 fn dumpStats(f: *Fuzzer) void {
351 std.log.info("stats: runs={d} deduplicated={d}", .{
352 f.n_runs, f.deduplicated_runs,
353 });
354 for (f.recent_cases.keys()[0..@min(f.recent_cases.entries.len, 5)], 0..) |run, i| {352 for (f.recent_cases.keys()[0..@min(f.recent_cases.entries.len, 5)], 0..) |run, i| {
355 std.log.info("best[{d}] id={x} score={d} input: '{}'", .{353 std.log.info("best[{d}] id={x} score={d} input: '{}'", .{
356 i, run.id, run.score, std.zig.fmtEscapes(run.input),354 i, run.id, run.score, std.zig.fmtEscapes(run.input),
...@@ -397,7 +395,6 @@ var fuzzer: Fuzzer = .{...@@ -397,7 +395,6 @@ var fuzzer: Fuzzer = .{
397 .flagged_pcs = undefined,395 .flagged_pcs = undefined,
398 .pc_counters = undefined,396 .pc_counters = undefined,
399 .n_runs = 0,397 .n_runs = 0,
400 .deduplicated_runs = 0,
401 .recent_cases = .{},398 .recent_cases = .{},
402 .coverage = undefined,399 .coverage = undefined,
403 .dir = undefined,400 .dir = undefined,