| // Copyright 2015 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | // A simple unit-test style driver for libfuzzer tests. | 
 | // Usage: <fuzzer_test> <file>... | 
 |  | 
 | #include <stddef.h> | 
 | #include <stdint.h> | 
 |  | 
 | #include <fstream> | 
 | #include <iostream> | 
 | #include <iterator> | 
 | #include <vector> | 
 |  | 
 | // Libfuzzer API. | 
 | extern "C" { | 
 |   // User function. | 
 |   int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size); | 
 |   // Initialization function. | 
 |   __attribute__((weak)) int LLVMFuzzerInitialize(int *argc, char ***argv); | 
 |   // Mutation function provided by libFuzzer. | 
 |   size_t LLVMFuzzerMutate(uint8_t *Data, size_t Size, size_t MaxSize); | 
 | } | 
 |  | 
 | std::vector<uint8_t> readFile(std::string path) { | 
 |   std::ifstream in(path); | 
 |   return std::vector<uint8_t>((std::istreambuf_iterator<char>(in)), | 
 |       std::istreambuf_iterator<char>()); | 
 | } | 
 |  | 
 | size_t LLVMFuzzerMutate(uint8_t *Data, size_t Size, size_t MaxSize) { | 
 |   return 0; | 
 | } | 
 |  | 
 | int main(int argc, char **argv) { | 
 |   if (argc == 1) { | 
 |     std::cerr | 
 |         << "Usage: " << argv[0] | 
 |         << " <file>...\n" | 
 |            "\n" | 
 |            "Alternatively, try building this target with " | 
 |            "use_libfuzzer=true for a better test driver. For details see:\n" | 
 |            "\n" | 
 |            "https://chromium.googlesource.com/chromium/src/+/master/" | 
 |            "testing/libfuzzer/getting_started.md" | 
 |         << std::endl; | 
 |     exit(1); | 
 |   } | 
 |  | 
 |   if (LLVMFuzzerInitialize) | 
 |     LLVMFuzzerInitialize(&argc, &argv); | 
 |  | 
 |   for (int i = 1; i < argc; ++i) { | 
 |     std::cout << argv[i] << std::endl; | 
 |     auto v = readFile(argv[i]); | 
 |     LLVMFuzzerTestOneInput(v.data(), v.size()); | 
 |   } | 
 | } |