authorgravatar for 28024277+tjog@users.noreply.github.comtjog <28024277+tjog@users.noreply.github.com> 2025-05-03 17:15:59+02:00
committergravatar for 28024277+tjog@users.noreply.github.comtjog <28024277+tjog@users.noreply.github.com> 2025-05-03 17:15:59+02:00
log3ed159964a34bb73ba484bae95c714449c16b0fc
tree10d631676b598145385d5c078e49777b4e9a036e
parentbf9b15ee67fb7577e30d66fda879b8af84f84b54
signaturebadge-check Signed by SSH key SHA256:P0rNeze1Ipi+HFiCG2BearRbTtiIXxe2JZL33zn69wg

libfuzzer: add standalone test for libfuzzer initialization


3 files changed, 51 insertions(+), 0 deletions(-)

test/standalone/build.zig.zon+3
...@@ -108,6 +108,9 @@...@@ -108,6 +108,9 @@
108 .libcxx = .{108 .libcxx = .{
109 .path = "libcxx",109 .path = "libcxx",
110 },110 },
111 .libfuzzer = .{
112 .path = "libfuzzer",
113 },
111 .load_dynamic_library = .{114 .load_dynamic_library = .{
112 .path = "load_dynamic_library",115 .path = "load_dynamic_library",
113 },116 },
test/standalone/libfuzzer/build.zig created+26
...@@ -0,0 +1,26 @@
1const std = @import("std");
2const builtin = @import("builtin");
3
4pub fn build(b: *std.Build) void {
5 const target = b.standardTargetOptions(.{});
6 const optimize = b.standardOptimizeOption(.{});
7
8 if (builtin.os.tag == .windows) return; // TODO: libfuzzer support for windows
9
10 const run_step = b.step("run", "Run executables");
11 const exe = b.addExecutable(.{
12 .name = "main",
13 .root_module = b.createModule(.{
14 .root_source_file = b.path("main.zig"),
15 .target = target,
16 .optimize = optimize,
17 .fuzz = true,
18 }),
19 });
20
21 b.installArtifact(exe);
22 b.default_step = run_step;
23
24 const run_artifact = b.addRunArtifact(exe);
25 run_step.dependOn(&run_artifact.step);
26}
test/standalone/libfuzzer/main.zig created+22
...@@ -0,0 +1,22 @@
1const std = @import("std");
2
3const FuzzerSlice = extern struct {
4 ptr: [*]const u8,
5 len: usize,
6
7 fn fromSlice(s: []const u8) FuzzerSlice {
8 return .{ .ptr = s.ptr, .len = s.len };
9 }
10};
11
12extern fn fuzzer_set_name(name_ptr: [*]const u8, name_len: usize) void;
13extern fn fuzzer_init(cache_dir: FuzzerSlice) void;
14extern fn fuzzer_init_corpus_elem(input_ptr: [*]const u8, input_len: usize) void;
15extern fn fuzzer_coverage_id() u64;
16
17pub fn main() !void {
18 fuzzer_init(FuzzerSlice.fromSlice(""));
19 fuzzer_init_corpus_elem("hello".ptr, "hello".len);
20 fuzzer_set_name("test".ptr, "test".len);
21 _ = fuzzer_coverage_id();
22}