commit f0feda820e678a7a8f7c2716b515145f4b9a5303 (tree)
parent bb79c85cb7ad591e0d8d4fe94b3c32883173c5fa
Author: Alex Rønne Petersen <alex@alexrp.com>
Date: Mon, 5 May 2025 07:23:18 +0200
Merge pull request #23727 from tjog/add-libfuzz-standalone-test
add standalone test for libfuzzer initialization
Diffstat:
5 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig
@@ -523,6 +523,7 @@ pub const getauxval = if (extern_getauxval) struct {
}.getauxval else getauxvalImpl;
fn getauxvalImpl(index: usize) callconv(.c) usize {
+ @disableInstrumentation();
const auxv = elf_aux_maybe orelse return 0;
var i: usize = 0;
while (auxv[i].a_type != std.elf.AT_NULL) : (i += 1) {
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
@@ -416,7 +416,7 @@ pub fn flushModule(
}
if (comp.config.any_fuzz) {
- try positionals.append(try link.openObjectInput(diags, comp.fuzzer_lib.?.full_object_path));
+ try positionals.append(try link.openArchiveInput(diags, comp.fuzzer_lib.?.full_object_path, false, false));
}
if (comp.ubsan_rt_lib) |crt_file| {
diff --git a/test/standalone/build.zig.zon b/test/standalone/build.zig.zon
@@ -108,6 +108,9 @@
.libcxx = .{
.path = "libcxx",
},
+ .libfuzzer = .{
+ .path = "libfuzzer",
+ },
.load_dynamic_library = .{
.path = "load_dynamic_library",
},
diff --git a/test/standalone/libfuzzer/build.zig b/test/standalone/libfuzzer/build.zig
@@ -0,0 +1,26 @@
+const std = @import("std");
+const builtin = @import("builtin");
+
+pub fn build(b: *std.Build) void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
+
+ if (builtin.os.tag == .windows) return; // TODO: libfuzzer support for windows
+
+ const run_step = b.step("run", "Run executables");
+ const exe = b.addExecutable(.{
+ .name = "main",
+ .root_module = b.createModule(.{
+ .root_source_file = b.path("main.zig"),
+ .target = target,
+ .optimize = optimize,
+ .fuzz = true,
+ }),
+ });
+
+ b.installArtifact(exe);
+ b.default_step = run_step;
+
+ const run_artifact = b.addRunArtifact(exe);
+ run_step.dependOn(&run_artifact.step);
+}
diff --git a/test/standalone/libfuzzer/main.zig b/test/standalone/libfuzzer/main.zig
@@ -0,0 +1,22 @@
+const std = @import("std");
+
+const FuzzerSlice = extern struct {
+ ptr: [*]const u8,
+ len: usize,
+
+ fn fromSlice(s: []const u8) FuzzerSlice {
+ return .{ .ptr = s.ptr, .len = s.len };
+ }
+};
+
+extern fn fuzzer_set_name(name_ptr: [*]const u8, name_len: usize) void;
+extern fn fuzzer_init(cache_dir: FuzzerSlice) void;
+extern fn fuzzer_init_corpus_elem(input_ptr: [*]const u8, input_len: usize) void;
+extern fn fuzzer_coverage_id() u64;
+
+pub fn main() !void {
+ fuzzer_init(FuzzerSlice.fromSlice(""));
+ fuzzer_init_corpus_elem("hello".ptr, "hello".len);
+ fuzzer_set_name("test".ptr, "test".len);
+ _ = fuzzer_coverage_id();
+}