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