SanitizerCoverage(SanCov)是 LLVM 提供的轻量级覆盖率反馈机制,通过 -fsanitize-coverage=trace-pc-guard 编译插桩,为 libFuzzer 提供基本块/边缘覆盖信息,需用 clang 编译、安全解析输入、关注 cov/ft 指标并可结合 llvm-cov 生成报告。

在 C++ 模糊测试中,SanitizerCoverage(即 SanCov)是 LLVM 提供的轻量级、低开销覆盖率反馈机制,它不依赖外部插桩工具(如 AFL 的 afl-clang-fast),而是通过编译器内置支持,为 libFuzzer 等基于覆盖率的模糊器提供基本块(Basic Block)、边缘(Edge)或函数级覆盖信息。它不是独立 fuzzing 工具,而是 libFuzzer 的“眼睛”——让模糊器知道“哪里还没跑过”,从而智能变异输入。
一、启用 SanitizerCoverage 编译目标代码
关键在于用 clang++(推荐 clang 12+)开启 -fsanitize-coverage=trace-pc-guard,这是 libFuzzer 推荐的模式,平衡精度与性能:
- 必须使用 clang/LLVM 工具链,GCC 不支持该 coverage 模式;
- 建议同时开启
-O2(优化不影响 coverage 插桩)和-g(便于调试崩溃); - 禁用
-fno-omit-frame-pointer(某些 sanitizer 模式需要,libFuzzer 默认要求); - 若目标含 C++ STL 或第三方库,确保它们也用相同 sanitizer flags 编译(或链接静态版 libFuzzer)。
示例编译命令:
clang++ -O2 -g -fsanitize=address,undefined \ -fsanitize-coverage=trace-pc-guard \ -stdlib=libc++ \ target.cpp \ -o target_fuzz \ /path/to/libFuzzer.a
登录后复制
二、编写符合 libFuzzer 要求的 fuzz target
入口函数必须严格为 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size),且不能调用 exit()、printf()(除非重定向)等干扰 fuzz loop 的操作:
立即学习“C++免费学习笔记(深入)”;
还木有评论哦,快来抢沙发吧~