fuzzing: comptime assertions to protect the ABI

compile errors are nice
This commit is contained in:
Andrew Kelley
2024-08-07 21:05:26 -07:00
parent 2cfad20204
commit 4e32edbff5
3 changed files with 21 additions and 1 deletions

View File

@@ -7,6 +7,7 @@ const Step = std.Build.Step;
const Coverage = std.debug.Coverage;
const abi = std.Build.Fuzz.abi;
const log = std.log;
const assert = std.debug.assert;
const WebServer = @This();
@@ -383,7 +384,10 @@ fn sendCoverageContext(
// TODO: make each events URL correspond to one coverage map
const coverage_map = &coverage_maps[0];
const cov_header: *const abi.SeenPcsHeader = @ptrCast(coverage_map.mapped_memory[0..@sizeOf(abi.SeenPcsHeader)]);
comptime assert(abi.SeenPcsHeader.trailing[0] == .pc_addr);
const seen_pcs = coverage_map.mapped_memory[@sizeOf(abi.SeenPcsHeader) + coverage_map.source_locations.len * @sizeOf(usize) ..];
comptime assert(abi.SeenPcsHeader.trailing[1][0] == .pc_bits);
comptime assert(abi.SeenPcsHeader.trailing[1][1] == u8);
const n_runs = @atomicLoad(usize, &cov_header.n_runs, .monotonic);
const unique_runs = @atomicLoad(usize, &cov_header.unique_runs, .monotonic);
const lowest_stack = @atomicLoad(usize, &cov_header.lowest_stack, .monotonic);
@@ -630,6 +634,7 @@ fn prepareTables(
gop.value_ptr.mapped_memory = mapped_memory;
const header: *const abi.SeenPcsHeader = @ptrCast(mapped_memory[0..@sizeOf(abi.SeenPcsHeader)]);
comptime assert(abi.SeenPcsHeader.trailing[0] == .pc_addr);
const pcs_bytes = mapped_memory[@sizeOf(abi.SeenPcsHeader)..][0 .. header.pcs_len * @sizeOf(usize)];
const pcs = std.mem.bytesAsSlice(usize, pcs_bytes);
const source_locations = try gpa.alloc(Coverage.SourceLocation, pcs.len);
@@ -649,6 +654,7 @@ fn addEntryPoint(ws: *WebServer, coverage_id: u64, addr: u64) error{ AlreadyRepo
const coverage_map = ws.coverage_files.getPtr(coverage_id).?;
const ptr = coverage_map.mapped_memory;
comptime assert(abi.SeenPcsHeader.trailing[0] == .pc_addr);
const pcs_bytes = ptr[@sizeOf(abi.SeenPcsHeader)..][0 .. coverage_map.source_locations.len * @sizeOf(usize)];
const pcs: []const usize = @alignCast(std.mem.bytesAsSlice(usize, pcs_bytes));
const index = std.sort.upperBound(usize, pcs, addr, struct {