超轻松进行C++ 模糊测试(Fuzzing)

模糊测试(Fuzzing)是一种非常常见的自动化测试手段,通过快速大量随机生成测试数据来实现对目标程序的测试。通常,我们都是使用AFL++或者libfuzzer 对某个程序的输入生成大量数据进行测试。然而,如果我们想要快速测试一个函数,还是有些困难的。

最近我使用C++11编写了一款能够支持fuzzing的header-only library。这就使得模糊测试变得非常简单。不过,由于目前仅支持libfuzzer引擎,所以必须使用clang编译器编译,使用范围还是稍微有所限制。

Github 仓库:

sunxfancy/zeroerr: A powerful C++ unit testing/assert/log utils

项目文档 | English Documentation

使用方法

cpp 复制代码
#define ZEROERR_IMPLEMENTATION
#include<zeroerr.hpp>

FUZZ_TEST_CASE("fuzz_test") {
    LOG("Run fuzz_test");
    FUZZ_FUNC([=](int k, std::string num) {
        int t = atoi(num.c_str());
        LOG("k: {k}, num:{num}, t: {t}", k, num, t);
        REQUIRE(k == t);
    })
        .WithDomains(InRange<int>(0, 10), Arbitrary<std::string>())
        .WithSeeds({{5, "Foo"}, {10, "Bar"}})
        .Run(10);
}

构建命令:

sh 复制代码
clang++ -std=c++11 -fsanitize=fuzzer-no-link -L=`clang++ -print-runtime-dir` -lclang_rt.fuzzer_no_main-x86_64  -o test_fuzz test_fuzz.cpp 

是不是非常的简单,下面简要介绍一下这个框架的使用逻辑,FUZZ_TEST_CASE 用来声明这是fuzzing 测试的测试用例,因为我们这个是一个通用单元测试框架,还可以使用TEST_CASE宏来编写其他测试。LOG是我们的日志宏,这里也提供日志的功能。

FUZZ_FUNC 用来创建一个要测试的 C++函数,可以是函数指针,也可以传入lambda,使用 REQUIRE 这个宏来测试结果,判断函数执行是否正确。最关键的是下面的WithDomains 函数,这里可以用来定义测试输入的数据范围,从而使得随机生成的测试数据不至于过于离谱,大大提升了效率。

WithSeeds则可以手工给定一组初始数据,其他生成的数据大多是基于其随机变更得来的。Run(10) 就是运行10次了,真正使用时你可以给个大的数字,比如50000-1000000。

相关推荐
TDTC_XQ13 分钟前
模板类的写法
linux·c++
CCCCCCCCharlie1 小时前
深入解析I/O底层:文件描述符与缓冲区真相
linux·开发语言·c++·算法
自信150413057591 小时前
重生之从0开始学习c++之string(下)
c++·学习·stl
wuminyu2 小时前
Continuation::freeze与thaw的x86_64汇编Stack Chunk拆解源码分析
java·linux·c语言·汇编·jvm·c++
kunicoding2 小时前
C++ 策略模式实战:写一个可以“一键换输出“的日志系统
开发语言·c++·策略模式
xiaoye-duck2 小时前
《C++ 项目:手写大模型接入 SDK》项目背景、目标及名词解释
服务器·网络·c++·语言模型
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】ChatServer接口设计规范
网络·c++·人工智能·学习·大模型·设计规范
纪念 2292 小时前
C++算法(三)
开发语言·c++·算法
AbandonForce3 小时前
递归、搜索与回溯:从板书到二叉树解题方法
c++·算法·决策树
艾莉丝努力练剑3 小时前
【AI大模型接入SDK】ChatServer HTTP接口模块实现总览
网络·c++·人工智能·网络协议·学习·http·架构