c++ - clang 的 libFuzzer 可以在同一个二进制文件中测试超过 1 个 API 吗?
问题描述
libFuzzer 的文档提供了一个如何对 API 进行模糊测试的示例:
#include <stdint.h>
#include <stddef.h>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
if (size > 0 && data[0] == 'H')
if (size > 1 && data[1] == 'I')
if (size > 2 && data[2] == '!')
__builtin_trap();
return 0;
}
我有接受不同 c++ 类型的单个实例的 API。我测试以下方式:
#include <stdint.h>
#include <stddef.h>
#include "my_api.hh"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
auto t = safe_deserialize<MyType>(data,size);
my_api(t);
return 0;
}
问题是,如果我想测试 10 个 API,我需要创建 10 个单独的二进制文件。我想要一个更类似于一组单元测试的二进制文件。像这样的东西:
#include <stdint.h>
#include <stddef.h>
#include "my_api.hh"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
auto t = safe_deserialize<MyType_1>(data,size);
my_api_1(t);
return 0;
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
auto t = safe_deserialize<MyType_2>(data,size);
my_api_2(t);
return 0;
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
auto t = safe_deserialize<MyType_3>(data,size);
my_api_3(t);
return 0;
}
这不起作用,因为您不能有重复的LLVMFuzzerTestOneInput
.
有没有办法使用 Clang 的 libFuzzer 工具在同一个二进制文件中测试多个 API?
我想我可以创建某种通用函数来分派给所有其他 API,但这是不可取的,因为这样我就需要构建一个实际上是不相关语料库的集合的语料库,并且崩溃结果将混合在各种 API 中。
解决方案
这个怎么样?你可以试试这个。不确定,它是否会起作用。
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
auto t1 = safe_deserialize<MyType_1>(data,size);
auto t3 = safe_deserialize<MyType_2>(data,size);
auto t3 = safe_deserialize<MyType_3>(data,size);
my_api_1(t1);
my_api_2(t2);
my_api_3(t3);
return 0;
}
推荐阅读
- php - PHP - ReflectionFunction - 函数测试::test_function() 不存在
- scala - 无法使用 Json4s 反序列化参数“jsonClass”
- multithreading - Oracle 非活动会话持有数据库锁
- c# - 以 zip 格式下载多个文档(Ajax 调用)不起作用
- php - 在 Symfony 的同一控制器中重定向到同一方法(分页链接)
- kentico - 如何让 TreeProvider.SelectNodes 像 CMSRepeater 一样以预览模式返回所有数据
- php - 如何从html表格行中获取ID?
- python - 如何在 Python 中识别 ARIMA 模型的 p(滞后顺序)
- spring - Redis - 为什么使用 Spring Data Redis 将详细信息同时保存为 HASH 和 SET?
- c - 从任何数据函数读取打印行