xref: /aosp_15_r20/external/clang/tools/clang-fuzzer/ClangFuzzer.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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