clang的libFuzzer可以在同一二进制文件中测试多个API吗?

时间:2018-10-20 18:29:31

标签: c++ clang++ fuzzing fuzz-testing libfuzzer

libFuzzer's documentation给出了如何模糊API的示例:

O(dt)

我有接受不同c ++类型的单个实例的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;
}

问题是,如果我想测试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>(data,size);
  my_api(t); 
  return 0;
}

这不起作用,因为您不能有#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; } 的重复实例。
有没有办法使用Clang的libFuzzer工具在同一二进制文件中测试多个API?

我想我可以创建某种通用函数,该函数可以分派给所有其他API,但这是不可取的,因为那样的话,我就需要构建一个实际上是不相关的语料集合的语料库,并且崩溃结果会混合在一起各种API。

1 个答案:

答案 0 :(得分: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;
    }