超轻松进行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。

相关推荐
2601_954526751 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
code_pgf1 小时前
`unordered_map` 详解
c++
一拳一个呆瓜3 小时前
【STL】iostream 编程:检测提取操作产生的错误
c++·stl
稚南城才子,乌衣巷风流3 小时前
判断素数与拓展应用
c++
众少成多积小致巨3 小时前
C++ 规范参考(下)
c++
c238563 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
txzrxz5 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
noipp5 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
c238565 小时前
C/C++每日一练6
c语言·c++·算法
念恒123066 小时前
网络基础
linux·网络·c++