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

相关推荐
syagain_zsx25 分钟前
jsoncpp 使用指南:编译链接、Json::Value 取值与高频坑
c++·json·库·http格式
布莱克6051 小时前
理解 = delete 与 = default:两种赋值语义的差异
c++
小小、码农2 小时前
[特殊字符]【C++11】类的新功能全面解析:移动构造、移动赋值、default、delete、final 与 override
linux·开发语言·网络·c++
库玛西3 小时前
外部排序全解析:败者树、置换-选择排序与最佳归并树
c语言·数据结构·c++·笔记·考研·算法
General_G4 小时前
创建型模式—原型(Prototype)模式
c++·设计模式·原型模式
syagain_zsx4 小时前
protobuf 实战:从 .proto 到 C++ 序列化的完整链路
c++·学习·程序人生·谷歌·protobuf
welfare9625 小时前
新号别搞:C++_list
开发语言·c++
xiaoye-duck5 小时前
《C++ 项目:手写大模型接入 SDK》云端 API 调用基础与 Apifox 调试实战
网络·c++·语言模型
坤坤子吖5 小时前
Linux 线程同步与互斥——条件变量与线程同步
linux·开发语言·c++·笔记·学习
杜 硕5 小时前
从零开始的C++生活——第二讲——03
c++·生活