Может ли libFuzzer от clang тестировать более 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;
}
У меня есть API, которые принимают в отдельных случаях разные типы C++. Я тестирую следующим образом:
#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 для тестирования более 1 API в одном бинарном файле?
Я полагаю, что мог бы создать какую-то универсальную функцию, которая отправляла бы всем остальным API, но это нежелательно, потому что тогда мне нужно было бы создать корпус, который на самом деле представляет собой набор несвязанных корпусов, и результаты сбоев будут смешаны между различными API.
0 ответов
Как насчет этого? Вы можете попробовать это. Не уверен, сработает это или нет.
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;
}