|  | // 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()); | 
|  | } | 
|  | } |