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;
}

相关内容

  • 没有找到相关文章

最新更新