struct fuzz [src]

ABI bits specifically relating to the fuzzer interface.

Members

Source

pub const fuzz = struct { /// libfuzzer uses this and its usize is the one that counts. To match the ABI, /// make the ints be the size of the target used with libfuzzer. /// /// Trailing: /// * 1 bit per pc_addr, usize elements /// * pc_addr: usize for each pcs_len pub const SeenPcsHeader = extern struct { n_runs: usize, unique_runs: usize, pcs_len: usize, /// Used for comptime assertions. Provides a mechanism for strategically /// causing compile errors. pub const trailing = .{ .pc_bits_usize, .pc_addr, }; pub fn headerEnd(header: *const SeenPcsHeader) []const usize { const ptr: [*]align(@alignOf(usize)) const u8 = @ptrCast(header); const header_end_ptr: [*]const usize = @ptrCast(ptr + @sizeOf(SeenPcsHeader)); const pcs_len = header.pcs_len; return header_end_ptr[0 .. pcs_len + seenElemsLen(pcs_len)]; } pub fn seenBits(header: *const SeenPcsHeader) []const usize { return header.headerEnd()[0..seenElemsLen(header.pcs_len)]; } pub fn seenElemsLen(pcs_len: usize) usize { return (pcs_len + @bitSizeOf(usize) - 1) / @bitSizeOf(usize); } pub fn pcAddrs(header: *const SeenPcsHeader) []const usize { const pcs_len = header.pcs_len; return header.headerEnd()[seenElemsLen(pcs_len)..][0..pcs_len]; } }; /// WebSocket server->client. /// /// Sent once, when fuzzing starts, to indicate the available coverage data. /// /// Trailing: /// * std.debug.Coverage.String for each directories_len /// * std.debug.Coverage.File for each files_len /// * std.debug.Coverage.SourceLocation for each source_locations_len /// * u8 for each string_bytes_len pub const SourceIndexHeader = extern struct { tag: ToClientTag = .fuzz_source_index, _: [3]u8 = @splat(0), directories_len: u32, files_len: u32, source_locations_len: u32, string_bytes_len: u32, /// When, according to the server, fuzzing started. start_timestamp: i64 align(4), }; /// WebSocket server->client. /// /// Sent whenever the set of covered source locations is updated. /// /// Trailing: /// * one bit per source_locations_len, contained in u64 elements pub const CoverageUpdateHeader = extern struct { tag: ToClientTag = .fuzz_coverage_update, _: [7]u8 = @splat(0), n_runs: u64, unique_runs: u64, pub const trailing = .{ .pc_bits_usize, }; }; /// WebSocket server->client. /// /// Sent whenever the set of entry points is updated. /// /// Trailing: /// * one u32 index of source_locations per locsLen() pub const EntryPointHeader = extern struct { tag: ToClientTag = .fuzz_entry_points, locs_len_raw: [3]u8, pub fn locsLen(hdr: EntryPointHeader) u24 { return @bitCast(hdr.locs_len_raw); } pub fn init(locs_len: u24) EntryPointHeader { return .{ .locs_len_raw = @bitCast(locs_len) }; } }; }