CheckOps
libFuzzer
libFuzzer is LLVM's in-process, coverage-guided, evolutionary fuzzing engine, built into Clang via -fsanitize=fuzzer and used with sanitizers to find memory-safety and logic bugs in C and C++.
Latest public signals
Not refreshed yet. Refresh reads the public site and, when the entry has a GitHub repository, the latest release.
Introduction
libFuzzer is an in-process, coverage-guided, evolutionary fuzzing engine that ships with LLVM. The documentation explains the model: libFuzzer is linked with the library under test and feeds fuzzed inputs to it through a fuzzing entry point, the target function. It tracks which areas of the code are reached, using LLVM’s SanitizerCoverage instrumentation, and mutates a corpus of inputs to maximise coverage.
The fuzz target is a single C function, LLVMFuzzerTestOneInput, that receives a byte array and calls the API under test. The docs stress that the target does not depend on libFuzzer, so the same target can be reused with other engines such as AFL or Radamsa. That portability is why libFuzzer-style targets became the common currency of the fuzzing ecosystem: OSS-Fuzz, ClusterFuzzLite, cargo-fuzz and many language bindings all build on the same interface.
Recent versions of Clang, from 6.0 onwards, include libFuzzer, so no extra installation is needed. You build with -fsanitize=fuzzer, usually combined with AddressSanitizer, UndefinedBehaviorSanitizer or both, and MemorySanitizer support is described as experimental. When the fuzzer finds a crash, sanitizer failure, leak or timeout, it stops and writes the triggering input to disk as crash-<sha1>, leak-<sha1> or timeout-<sha1>, giving you a reproducible regression case.
Corpus handling is central. Coverage-guided fuzzers rely on seed inputs, ideally a varied collection of valid and invalid examples; mutations that reach new code paths are added to the corpus. The -merge=1 flag minimises a large corpus while preserving coverage, and the corpus doubles as a regression suite that confirms the entry point still works. Parallel fuzzing runs several processes sharing a corpus with -jobs and -workers, and an experimental -fork mode adds crash-, timeout- and OOM-resistant fuzzing.
One status note matters for planning: the documentation says libFuzzer’s original authors have stopped active work on it and moved to another engine, Centipede. libFuzzer is still fully supported in that important bugs get fixed, but major new features are not expected. In practice it remains the default engine in much of the ecosystem, and the targets you write stay portable to newer engines.
In the CheckOps stage model libFuzzer belongs to Security, with a foot in Unit testing: fuzz targets sit next to unit tests and run briefly in CI, while longer campaigns run on schedules or on services like OSS-Fuzz.
Budget fuzzing time deliberately: a few minutes per target on pull requests catches shallow regressions, while hours or days per target in scheduled jobs finds deeper bugs.
Keeping crash inputs in the repository makes regressions visible immediately.
Features
- Coverage-guided: SanitizerCoverage feedback drives mutation.
- In-process: Fast execution without process restarts.
- Built into Clang: Enable with -fsanitize=fuzzer.
- Sanitizer integration: ASan, UBSan and experimental MSan.
- Corpus merge: Minimise corpora while keeping coverage.
- Parallel jobs: Shared corpus across workers.
- Fork mode: Crash- and OOM-resistant experimental mode.
- Reproducers: Crashing inputs saved to disk.
- Portable targets: Same entry point works with AFL and others.
Pros
- Free and open source: Part of the LLVM project under Apache-2.0 with LLVM exceptions.
- Ecosystem standard: Targets work across OSS-Fuzz, ClusterFuzzLite and other engines.
- No extra install: Included in Clang 6.0 and later.
Cons
- Maintenance mode: Original authors moved to Centipede; mainly bug fixes now.
- C and C++ focus: Other languages need bindings or wrappers.
- Clang required: Needs a matching Clang version.
- Target design effort: Good targets must be fast, deterministic and narrow.
Usage and Links (Example)
// fuzz_target.c
#include <stdint.h>
#include <stddef.h>
int parse_header(const uint8_t *data, size_t size);
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
parse_header(Data, Size);
return 0;
}
clang -g -O1 -fsanitize=fuzzer,address fuzz_target.c parser.c -o fuzz_header
mkdir -p corpus && cp samples/* corpus/
./fuzz_header corpus -max_total_time=300
Practical tips:
- Keep one target per input format and avoid global state.
- Seed the corpus with real files and commit a minimised corpus.
- Run short time-boxed fuzzing in pull requests and long runs nightly or on OSS-Fuzz.
- Turn every crash input into a permanent regression test.
Resources:
Pricing
libFuzzer is free and open source as part of the LLVM project (Apache-2.0 with LLVM exceptions).
Recommended for?
- C and C++ teams parsing untrusted input.
- Security engineers building fuzzing into CI.
- Open-source maintainers preparing for OSS-Fuzz integration.
- Not ideal for teams needing actively developed new engine features.
Conclusion
libFuzzer remains the reference coverage-guided fuzzing engine for C and C++: built into Clang, tightly integrated with sanitizers, and supported across the fuzzing ecosystem.
Its maintenance status means new features will come elsewhere, but writing libFuzzer-style targets is still the most portable investment you can make in fuzz testing.
On CheckOps, libFuzzer is filed under the Security testing and Unit testing stages. Related tools listed here include AFL++, honggfuzz, LibAFL, OSS-Fuzz, ClusterFuzzLite and cargo-fuzz. A short trial on a real project, with your own code, data and pipeline, is usually the fastest way to choose between them, because fit matters more than feature lists. Facts here come from the official site, documentation and repository, checked on 11 November 2026.
Compare
CheckOps pages that put libFuzzer next to related tools. There is no paid placement on these lists.
Roundups
Alternatives
Other tools on CheckOps that cover similar ground. Open a page, or compare one with libFuzzer side by side.
AAFL++AFL++ is the community-maintained successor to Google's AFL: a coverage-guided fuzzer with faster execution, better mutations and instrumentation, custom mutators and modes for binaries, licensed AGPL-3.0-or-later.Compare with libFuzzer
Hhonggfuzzhonggfuzz is Google's Apache-2.0 security-oriented fuzzer with evolutionary, feedback-driven fuzzing based on software and hardware code coverage.Compare with libFuzzer
LLibAFLLibAFL is a Rust library of reusable fuzzer components from the AFL++ team, for building fast, scalable, custom fuzzers across platforms and targets.Compare with libFuzzer
OOSS-FuzzOSS-Fuzz is Google's free continuous fuzzing service for critical open-source projects, running libFuzzer, AFL++ and other engines at scale on ClusterFuzz.Compare with libFuzzer
CClusterFuzzLiteClusterFuzzLite is Google's Apache-2.0 continuous fuzzing solution that runs in CI such as GitHub Actions, fuzzing pull requests and running batch fuzzing with coverage reports.Compare with libFuzzer
Ccargo-fuzzcargo-fuzz is the Rust Fuzz project's Cargo subcommand for fuzzing Rust code with libFuzzer, handling target scaffolding, running and test-case minimisation.Compare with libFuzzer