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

相关推荐
端平入洛18 小时前
delete又未完全delete
c++
端平入洛2 天前
auto有时不auto
c++
哇哈哈20213 天前
信号量和信号
linux·c++
多恩Stone3 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马3 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
超级大福宝3 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
weiabc3 天前
printf(“%lf“, ys) 和 cout << ys 输出的浮点数格式存在细微差异
数据结构·c++·算法
问好眼3 天前
《算法竞赛进阶指南》0x01 位运算-3.64位整数乘法
c++·算法·位运算·信息学奥赛
yyjtx3 天前
DHU上机打卡D31
开发语言·c++·算法
czxyvX3 天前
020-C++之unordered容器
数据结构·c++