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