1 //===-- lldb-commandinterpreter-fuzzer.cpp -------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===---------------------------------------------------------------------===//
8 
9 #include <string>
10 
11 #include "lldb/API/SBCommandInterpreter.h"
12 #include "lldb/API/SBCommandInterpreterRunOptions.h"
13 #include "lldb/API/SBCommandReturnObject.h"
14 #include "lldb/API/SBDebugger.h"
15 #include "lldb/API/SBTarget.h"
16 
17 using namespace lldb;
18 
LLVMFuzzerInitialize(int * argc,char *** argv)19 extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) {
20   SBDebugger::Initialize();
21   return 0;
22 }
23 
LLVMFuzzerTestOneInput(uint8_t * data,size_t size)24 extern "C" int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {
25   // Convert the data into a null-terminated string
26   std::string str((char *)data, size);
27 
28   // Create a debugger and a dummy target
29   SBDebugger debugger = SBDebugger::Create(false);
30   SBTarget target = debugger.GetDummyTarget();
31 
32   // Create a command interpreter for the current debugger
33   // A return object is needed to run the command interpreter
34   SBCommandReturnObject ro = SBCommandReturnObject();
35   SBCommandInterpreter ci = debugger.GetCommandInterpreter();
36 
37   // Use the fuzzer generated input as input for the command interpreter
38   if (ci.IsValid()) {
39     ci.HandleCommand(str.c_str(), ro, false);
40   }
41 
42   debugger.DeleteTarget(target);
43   SBDebugger::Destroy(debugger);
44   SBModule::GarbageCollectAllocatedModules();
45 
46   return 0;
47 }
48