| ... | @@ -476,23 +476,33 @@ test "fuzz string escaping" { | ... | @@ -476,23 +476,33 @@ test "fuzz string escaping" { |
| 476 | } | 476 | } |
| 477 | | 477 | |
| 478 | fn fuzzString(options: StringOptions, smith: *std.testing.Smith) !void { | 478 | fn fuzzString(options: StringOptions, smith: *std.testing.Smith) !void { |
| 479 | var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); | 479 | const gpa = std.testing.allocator; |
| 480 | defer arena.deinit(); | | |
| 481 | const allocator = arena.allocator(); | | |
| 482 | | 480 | |
| 483 | var allocating: Writer.Allocating = .init(allocator); | 481 | var arena_state: std.heap.ArenaAllocator = .init(gpa); |
| | 482 | defer arena_state.deinit(); |
| | 483 | const arena = arena_state.allocator(); |
| | 484 | |
| | 485 | var allocating: Writer.Allocating = .init(gpa); |
| 484 | defer allocating.deinit(); | 486 | defer allocating.deinit(); |
| 485 | var s: Serializer = .{ .writer = &allocating.writer }; | 487 | var s: Serializer = .{ .writer = &allocating.writer }; |
| 486 | | 488 | |
| 487 | var buf: [0x100]u8 = undefined; | 489 | var buf: [0x100]u8 = undefined; |
| 488 | const input_len = smith.slice(&buf); | 490 | const input = buf[0..smith.slice(&buf)]; |
| 489 | const input = buf[0..input_len]; | | |
| 490 | try s.string(input, options); | 491 | try s.string(input, options); |
| 491 | | 492 | |
| 492 | const encoded = try allocator.dupeSentinel(u8, allocating.written(), 0); | 493 | var parse_diags: std.zon.parse.Diagnostics = undefined; |
| 493 | defer allocator.free(encoded); | 494 | const actual = std.zon.parse.fromSlice([]const u8, .{ |
| 494 | const actual = try std.zon.parse.fromSliceAlloc([]const u8, allocator, encoded, null, .{}); | 495 | .gpa = gpa, |
| 495 | defer std.zon.parse.free(allocator, actual); | 496 | .arena = arena, |
| | 497 | .source = try arena.dupeSentinel(u8, allocating.written(), 0), |
| | 498 | .diagnostics = &parse_diags, |
| | 499 | }) catch |err| switch (err) { |
| | 500 | error.OutOfMemory => |e| return e, |
| | 501 | error.ParseZon => |e| { |
| | 502 | std.log.err("failed to parse serialized ZON: {f}", .{parse_diags.fmt("fuzz_input")}); |
| | 503 | return e; |
| | 504 | }, |
| | 505 | }; |
| 496 | try std.testing.expectEqualSlices(u8, input, actual); | 506 | try std.testing.expectEqualSlices(u8, input, actual); |
| 497 | } | 507 | } |
| 498 | | 508 | |