Home | History | Annotate | Download | only in clang-fuzzer
      1 //===-- ClangFuzzer.cpp - Fuzz Clang --------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 ///
     10 /// \file
     11 /// \brief This file implements a function that runs Clang on a single
     12 ///  input. This function is then linked into the Fuzzer library.
     13 ///
     14 //===----------------------------------------------------------------------===//
     15 
     16 #include "clang/Tooling/Tooling.h"
     17 #include "clang/Frontend/FrontendActions.h"
     18 #include "clang/Frontend/CompilerInstance.h"
     19 #include "llvm/Option/Option.h"
     20 
     21 using namespace clang;
     22 
     23 extern "C" int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {
     24   std::string s((const char *)data, size);
     25   llvm::opt::ArgStringList CC1Args;
     26   CC1Args.push_back("-cc1");
     27   CC1Args.push_back("./test.cc");
     28   llvm::IntrusiveRefCntPtr<FileManager> Files(
     29       new FileManager(FileSystemOptions()));
     30   IgnoringDiagConsumer Diags;
     31   IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
     32   DiagnosticsEngine Diagnostics(
     33       IntrusiveRefCntPtr<clang::DiagnosticIDs>(new DiagnosticIDs()), &*DiagOpts,
     34       &Diags, false);
     35   std::unique_ptr<clang::CompilerInvocation> Invocation(
     36       tooling::newInvocation(&Diagnostics, CC1Args));
     37   std::unique_ptr<llvm::MemoryBuffer> Input =
     38       llvm::MemoryBuffer::getMemBuffer(s);
     39   Invocation->getPreprocessorOpts().addRemappedFile("./test.cc", Input.release());
     40   std::unique_ptr<tooling::ToolAction> action(
     41       tooling::newFrontendActionFactory<clang::SyntaxOnlyAction>());
     42   std::shared_ptr<PCHContainerOperations> PCHContainerOps =
     43       std::make_shared<PCHContainerOperations>();
     44   action->runInvocation(Invocation.release(), Files.get(), PCHContainerOps,
     45                         &Diags);
     46   return 0;
     47 }
     48