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