Может ли 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;
}

У меня есть 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.


person Trevor Hickey    schedule 20.10.2018    source источник
comment
какие-либо предложения по реализации обсуждаемой вами проблемы?   -  person Keith Ape    schedule 01.05.2020
comment
@KeithApe Я просто создаю программу для каждого API, который хочу фаззить. Как правило, мы можем просто выбрать некоторые высокоуровневые функции, и это позволит получить доступ к остальной части кода.   -  person Trevor Hickey    schedule 01.05.2020


Ответы (1)


Как насчет этого? Вы можете попробовать это. Не уверен, сработает или нет.

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;
    }
person Neeraj Bansal    schedule 22.09.2019