| ... | @@ -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 | } |
| 29 | | 28 | |
| 30 | export threadlocal var __sancov_lowest_stack: usize = 0; | 29 | export threadlocal var __sancov_lowest_stack: usize = std.math.maxInt(usize); |
| 31 | | 30 | |
| 32 | var module_count_8bc: usize = 0; | 31 | var module_count_8bc: usize = 0; |
| 33 | var module_count_pcs: usize = 0; | 32 | var 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 of | 110 | /// 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 { |
| 120 | | 118 | |
| 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 | } |
| 349 | | 350 | |
| 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, |