Use this skill to fuzz open source Go software projects.
npx skills add https://github.com/google/oss-fuzz --skill fuzzing-go-expert
This skill provides the agent with the knowledge and tools to write, build, and
validate fuzz targets for Go projects integrated into OSS-Fuzz. Go fuzzing uses
the native Go fuzzing framework introduced in Go 1.18, which OSS-Fuzz drives
via libFuzzer under the hood using compile_native_go_fuzzer.
Go projects must use the Go base builder image:
FROM gcr.io/oss-fuzz-base/base-builder-go
Set language: go in project.yaml.
Go fuzz targets are standard Go test functions with the prefix Fuzz, placed
in _test.go files (or plain .go files that import the testing package):
package mypkg
import (
"testing"
_ "github.com/AdamKorcz/go-118-fuzz-build/testing" // required for OSS-Fuzz native fuzzing
)
func FuzzMyTarget(f *testing.F) {
// Seed corpus: add representative valid inputs so the fuzzer starts
// from a meaningful state rather than empty bytes.
f.Add([]byte("example input"))
f.Add([]byte("another seed"))
f.Fuzz(func(t *testing.T, data []byte) {
// Call into the target. Ignore expected errors; let unexpected
// panics surface as findings.
_, _ = ParseSomething(data)
})
}
The inner f.Fuzz callback signature can use typed parameters instead of
[]byte when the target expects structured input:
f.Fuzz(func(t *testing.T, s string, n int, b bool) {
_ = ProcessRecord(s, n, b)
})
Use the compile_native_go_fuzzer helper in build.sh. It takes the package
import path, the function name, and the output binary name:
# build.sh
cp $SRC/fuzz_test.go ./ # copy harness into the module if needed
printf "package mypkg\nimport _ \"github.com/AdamKorcz/go-118-fuzz-build/testing\"\n" \
> register.go # required registration shim
go mod tidy
compile_native_go_fuzzer github.com/owner/repo/pkg FuzzMyTarget fuzz_my_target
For projects with multiple packages or multiple fuzz targets repeat the call:
compile_native_go_fuzzer github.com/owner/repo/pkg1 FuzzFoo fuzz_foo
compile_native_go_fuzzer github.com/owner/repo/pkg2 FuzzBar fuzz_bar
$OUT/<fuzzer_name>_seed_corpus/ as individualfiles, or as a zip at $OUT/<fuzzer_name>_seed_corpus.zip.
$OUT/<fuzzer_name>.dict as plaintext token files.f.Add(...) in the harness — theseare compiled in and used as the initial corpus.
beats hand-picking a few files — random mutation rarely passes the parser's
early checks. See the [structured seed generation
reference](../oss-fuzz-engineer/references/structured_seed_generation.md).
serialisation/deserialisation, and any API that accepts untrusted bytes or
strings.
expected error returns. Only genuine panics and unexpected behaviour are
findings.
Go's fuzzer can mutate string, int, bool, float64, etc. directly.
global state that persists between calls.
files) belongs outside f.Fuzz(...), not inside the inner function.
f.Add(...) entries should be validrepresentative inputs so coverage grows from the start.
inside the fuzz function.
"github.com/AdamKorcz/go-118-fuzz-build/testing"` blank import is required
for OSS-Fuzz to hook into native Go fuzzing — never omit it.
Go is memory-safe, so the focus shifts from memory-corruption bugs to:
failures, stack overflows — any unrecovered panic is a crash.
valid input.
(detected by OSS-Fuzz's timeout).
instead, or vice versa.
python3 infra/helper.py build_fuzzers <project>
python3 infra/helper.py check_build <project>
python3 infra/helper.py run_fuzzer <project> <fuzzer_name> -- -max_total_time=30
missing error handling, bad seed, wrong package path).
go vet ./... and go build ./... inside the module before wrapping inan OSS-Fuzz build to catch compile errors early.
RUN git clone to COPY to avoid network round-trips.
Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.
Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
Replace with description of the skill and when Claude should use it.
Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies
This skill should be used when the user wants to "create a skill", "add a skill to plugin", "write a new skill", "improve skill description", "organize skill content", or needs guidance on skill structure, progressive disclosure, or skill development best practices for Claude Code plugins.
Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
Use when creating new skills, editing existing skills, or verifying skills work before deployment
Take google/fuzzing-go-expert from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.