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

相关推荐
别动我齐刘海6 小时前
Linux 系统调试学习1
linux·运维·服务器·c++·学习·机器学习·机器人
jimy111 小时前
C++ 虚函数表:基类和派生类共用一张 vtable 吗?
开发语言·c++
爱吃提升11 小时前
Dev-C++ 5.11 C++断点调试完整教程
开发语言·c++
xlq2232212 小时前
全面复习7
c++
geats人山人海12 小时前
现代c++2.4 虚继承
java·开发语言·c++
csuzhucong12 小时前
天元一号、二号、三号
c++
灯澜忆梦13 小时前
【面向对象编程c++】| 数组与函数
java·数据结构·c++
起个名字费劲死了13 小时前
VisionMaster 十二点标定+单点抓取
c++·visionmaster
Lzg_na15 小时前
僵尸进程、孤儿进程、守护进程:含义、区别与生命周期详解
c++
zhanghaha131415 小时前
C++ 的类是什么(新手保姆讲解,配合 Qt 对照理解)
c++