Files
ghostty/test/fuzz-libghostty/build.zig
Mitchell Hashimoto 346248251e typos
2026-02-28 21:14:52 -08:00

57 lines
1.8 KiB
Zig

const std = @import("std");
const afl = @import("afl");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const run_step = b.step("run", "Run the fuzzer with afl-fuzz");
// Create the C ABI library from Zig source that exports the
// API that the `afl-cc` main.c entrypoint can call into. This
// lets us just use standard `afl-cc` to fuzz test our library without
// needing to write any Zig-specific fuzzing harnesses.
const lib = lib: {
// Zig module
const lib_mod = b.createModule(.{
.root_source_file = b.path("src/lib.zig"),
.target = target,
.optimize = optimize,
});
if (b.lazyDependency("ghostty", .{
.simd = false,
})) |dep| {
lib_mod.addImport(
"ghostty-vt",
dep.module("ghostty-vt"),
);
}
// C lib
const lib = b.addLibrary(.{
.name = "ghostty-fuzz",
.root_module = lib_mod,
});
// Required to build properly with afl-cc
lib.root_module.stack_check = false;
lib.root_module.fuzz = true;
break :lib lib;
};
// Build a C entrypoint with afl-cc that links against the generated
// static Zig library. afl-cc is expected to be on the PATH.
const exe = afl.addInstrumentedExe(b, lib);
// Runner to simplify running afl-fuzz
const run = afl.addFuzzerRun(b, exe, b.path("corpus/initial"), b.path("afl-out"));
// Install
b.installArtifact(lib);
const exe_install = b.addInstallBinFile(exe, "ghostty-fuzz");
b.getInstallStep().dependOn(&exe_install.step);
// Run
run_step.dependOn(&run.step);
}