用途:为接入 OSS-Fuzz 的 Go 开源项目编写、构建和验证 fuzz 目标(harness)。Go 模糊测试基于 Go 1.18 引入的原生 fuzzing 框架,OSS-Fuzz 底层通过 libFuzzer 与 compile_native_go_fuzzer 驱动。
主要能力与结构:Go 项目须使用 Go 基础构建镜像 FROM gcr.io/oss-fuzz-base/base-builder-go,并在 project.yaml 中设置 language: go。fuzz 目标是前缀为 Fuzz 的标准 Go 测试函数,放在 _test.go 或导入 testing 包的 .go 文件中,且必须空白导入 github.com/AdamKorcz/go-118-fuzz-build/testing 作为注册垫片。内层 f.Fuzz 回调可使用 []byte,也可用 string、int、bool、float64 等类型化参数。可用 f.Add(...) 添加种子语料。
构建方式:在 build.sh 中使用 compile_native_go_fuzzer,参数为包导入路径、函数名和输出二进制名,例如 compile_native_go_fuzzer github.com/owner/repo/pkg FuzzMyTarget fuzz_my_target;多包多目标可重复调用。种子语料可放 $OUT/<fuzzer_name>_seed_corpus/ 或 zip,字典放 $OUT/<fuzzer_name>.dict。
适用场景:解析器、解码器、协议处理、序列化/反序列化,以及任何接受不可信字节或字符串的 API。Go 内存安全,因此重点发现 panic(越界、空指针、类型断言失败、栈溢出)、逻辑错误、死循环/挂起和错误处理不当。
限制与要求:harness 应优雅处理预期错误、避免非确定性(随机源、时间、goroutine、持久全局状态)、保持回调快速、提供有意义种子、避免忙循环或阻塞 I/O。验证命令:python3 infra/helper.py build_fuzzers <project>、check_build <project>、run_fuzzer <project> <fuzzer_name> -- -max_total_time=30。若瞬间崩溃通常说明 harness 本身有误。建议先运行 go vet ./... 和 go build ./...。本地迭代可克隆上游仓库并把 Dockerfile 的 RUN git clone 改为 COPY。