Может ли libFuzzer от clang тестировать более 1 API в одном бинарном файле? - PullRequest
0 голосов
/ 20 октября 2018

В документации 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.

...