0Pricing
C++ Academy · 课时

使用 libFuzzer 进行模糊测试

使用 libFuzzer 对代码进行模糊测试,发现边界情况导致的崩溃

使用 libFuzzer 进行模糊测试 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

为什么要进行模糊测试?

模糊测试会生成随机输入,以查找崩溃、卡死和安全漏洞。现代模糊测试器会使用覆盖率反馈来逐步改进输入,探索新的代码路径。

libFuzzer

libFuzzer 是 LLVM 的一部分,并且可以与运行时检测器集成。编写一个对单个入口点进行模糊测试的函数,其余输入生成工作由框架驱动。

编写模糊测试目标

函数签名是固定的:接收一个字节数组,并返回 0。

#include <cstdint>
#include <cstddef>

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
    parse_input(reinterpret_cast<const char*>(data), size);
    return 0;
}

为 libFuzzer 编译

将 Clang 与 -fsanitize=fuzzer,address 组合使用。直接进行链接——不需要 main。

clang++ -g -O1 -fsanitize=fuzzer,address fuzz.cpp parser.cpp -o fuzz_target
./fuzz_target

覆盖率引导的变异

libFuzzer 会跟踪每个输入执行了哪些代码路径。它会对有潜力的输入进行变异,以探索更深层的路径,这比盲目随机生成高效得多。

输入语料库

使用包含已知有趣输入的目录为模糊测试器提供种子。模糊测试器会通过对这些输入进行变异来生成新输入。

./fuzz_target corpus/

字典文件

提供包含常见标记的字典,以加快对符合语法的输入(HTML、JSON、协议消息)的探索。

与运行时检测器结合

在 AddressSanitizer 下运行,可以将原本无声的内存损坏转化为模糊测试器能够检测的即时崩溃。

性能

在小型目标上,单个核心每秒可以执行数万次。运行数小时或数天,并让它在 CI 后台持续运行。

重现崩溃

当 libFuzzer 发现崩溃时,会将输入保存到磁盘。之后可以重放该输入进行调试。

./fuzz_target crash-abc123

OSS-Fuzz

Google 的 OSS-Fuzz 会持续对开源项目运行模糊测试器并报告错误。许多知名库都已与它集成。

AFL 和 Honggfuzz

还有其他模糊测试器:

  • AFL/AFL++——基于进程,并通过派生服务器提升速度
  • Honggfuzz——支持网络协议

libFuzzer 是最容易集成到 C++ 中的模糊测试器。

何时进行模糊测试

对任何处理不可信输入的代码进行模糊测试:

  • 解析器(JSON、XML、protobuf)
  • 解码器(图像、音频、视频)
  • 网络协议处理器
  • 任何读取外部数据的代码

快速检查

为什么覆盖率引导的模糊测试比纯随机模糊测试更有效?

回顾

libFuzzer 是一个与 Clang 集成的覆盖率引导模糊测试器。编写一个小型 LLVMFuzzerTestOneInput 入口,使用 -fsanitize=fuzzer,address 构建,然后让它搜索崩溃。结合运行时检测器和输入语料库使用;对任何接触不可信输入的代码进行模糊测试。

常见问题解答

「使用 libFuzzer 进行模糊测试」课时是免费的吗?

是的 — 「使用 libFuzzer 进行模糊测试」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「使用 libFuzzer 进行模糊测试」这节课中我会学到什么?

使用 libFuzzer 对代码进行模糊测试,发现边界情况导致的崩溃 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 libFuzzer 进行模糊测试」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 静态分析工具:clang-tidy、cppcheck
  2. Sanitizer:Address、Thread、UB Sanitizer
  3. 使用 libFuzzer 进行模糊测试
  4. C++ 项目的持续集成
← 返回 C++ Academy