I recently noticed LLDB crash during execution of `script print(lldb.SBDebugger().GetBroadcaster().GetName())` command: ``` PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace. Stack dump: 0. Program arguments: /home/sergei/llvm-project/build/bin/lldb-dap #0 0x000062735c3403d2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/sergei/llvm-project/build/bin/lldb-dap+0x7c3d2) #1 0x000062735c33d7ec llvm::sys::RunSignalHandlers() (/home/sergei/llvm-project/build/bin/lldb-dap+0x797ec) #2 0x000062735c33d94c SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0 #3 0x00007eaa6aa45330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330) #4 0x00007eaa6bb0c092 lldb::SBBroadcaster::GetName() const (/home/sergei/llvm-project/build/bin/../lib/liblldb.so.23.0git+0x90c092) #5 0x00007eaa6bcb9a5d _wrap_SBBroadcaster_GetName LLDBWrapPython.cpp:0:0 #6 0x00007eaa6a1df5f5 (/lib/x86_64-linux-gnu/libpython3.12.so.1.0+0x1df5f5) #7 0x00007eaa6a182b2c PyObject_Vectorcall (/lib/x86_64-linux-gnu/libpython3.12.so.1.0+0x182b2c) #8 0x00007eaa6a11d5ee _PyEval_EvalFrameDefault (/lib/x86_64-linux-gnu/libpython3.12.so.1.0+0x11d5ee) #9 0x00007eaa6a2a091f PyEval_EvalCode (/lib/x86_64-linux-gnu/libpython3.12.so.1.0+0x2a091f) #10 0x00007eaa6a29c8b0 (/lib/x86_64-linux-gnu/libpython3.12.so.1.0+0x29c8b0) #11 0x00007eaa6a11fbd3 _PyEval_EvalFrameDefault (/lib/x86_64-linux-gnu/libpython3.12.so.1.0+0x11fbd3) #12 0x00007eaa6c4891b7 lldb_private::ScriptInterpreterPythonImpl::ExecuteOneLine(llvm::StringRef, lldb_private::CommandReturnObject*, lldb_private::ExecuteScriptOptions const&) (/home/sergei/llvm-project/build/bin/../lib/liblldb.so.23.0git+0x12891b7) #13 0x00007eaa70326ff5 CommandObjectScriptingRun::DoExecute(llvm::StringRef, lldb_private::CommandReturnObject&) (/home/sergei/llvm-project/build/bin/../lib/liblldb.so.23.0git+0x5126ff5) #14 0x00007eaa6bee3739 lldb_private::CommandObjectRaw::Execute(char const*, lldb_private::CommandReturnObject&) (/home/sergei/llvm-project/build/bin/../lib/liblldb.so.23.0git+0xce3739) #15 0x00007eaa6bede09a lldb_private::CommandInterpreter::HandleCommand(char const*, lldb_private::LazyBool, lldb_private::CommandReturnObject&, bool) (/home/sergei/llvm-project/build/bin/../lib/liblldb.so.23.0git+0xcde09a) #16 0x00007eaa6bb0f0f8 lldb::SBCommandInterpreter::HandleCommand(char const*, lldb::SBExecutionContext&, lldb::SBCommandReturnObject&, bool) (/home/sergei/llvm-project/build/bin/../lib/liblldb.so.23.0git+0x90f0f8) #17 0x00007eaa6bb0f265 lldb::SBCommandInterpreter::HandleCommand(char const*, lldb::SBCommandReturnObject&, bool) (/home/sergei/llvm-project/build/bin/../lib/liblldb.so.23.0git+0x90f265) #18 0x000062735c3707f3 lldb_dap::RunLLDBCommands[abi:cxx11](lldb::SBDebugger&, lldb::SBMutex, llvm::StringRef, llvm::ArrayRef<lldb_dap::protocol::String> const&, bool&, bool, bool) (/home/sergei/llvm-project/build/bin/lldb-dap+0xac7f3) #19 0x000062735c3a8019 lldb_dap::EvaluateRequestHandler::Run(lldb_dap::protocol::EvaluateArguments const&) const (/home/sergei/llvm-project/build/bin/lldb-dap+0xe4019) #20 0x000062735c3aba78 lldb_dap::RequestHandler<lldb_dap::protocol::EvaluateArguments, llvm::Expected<lldb_dap::protocol::EvaluateResponseBody>>::operator()(lldb_dap::protocol::Request const&) const (/home/sergei/llvm-project/build/bin/lldb-dap+0xe7a78) #21 0x000062735c3ce1bf lldb_dap::BaseRequestHandler::Run(lldb_dap::protocol::Request const&) (/home/sergei/llvm-project/build/bin/lldb-dap+0x10a1bf) #22 0x000062735c3577e7 lldb_dap::DAP::HandleObject(std::variant<lldb_dap::protocol::Request, lldb_dap::protocol::Response, lldb_dap::protocol::Event> const&) (/home/sergei/llvm-project/build/bin/lldb-dap+0x937e7) #23 0x000062735c358705 lldb_dap::DAP::Loop() (/home/sergei/llvm-project/build/bin/lldb-dap+0x94705) #24 0x000062735c2ed0c7 main (/home/sergei/llvm-project/build/bin/lldb-dap+0x290c7) #25 0x00007eaa6aa2a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3 ``` As far as I understand default constuctors should be covered by fuzzing tests, so I don't know how to write test for that patch.
67 lines
2.0 KiB
Python
67 lines
2.0 KiB
Python
"""
|
|
Fuzz tests an object after the default construction to make sure it does not crash lldb.
|
|
"""
|
|
|
|
import lldb
|
|
|
|
|
|
def fuzz_obj(obj):
|
|
obj.SetAsync(True)
|
|
obj.SetAsync(False)
|
|
obj.GetAsync()
|
|
obj.SkipLLDBInitFiles(True)
|
|
obj.SetInputFileHandle(None, True)
|
|
obj.SetOutputFileHandle(None, True)
|
|
obj.SetErrorFileHandle(None, True)
|
|
obj.SetInputString("")
|
|
obj.GetInputFileHandle()
|
|
obj.GetOutputFileHandle()
|
|
obj.GetErrorFileHandle()
|
|
obj.GetCommandInterpreter()
|
|
obj.HandleCommand("nothing here")
|
|
listener = obj.GetListener()
|
|
broadcaster = obj.GetBroadcaster()
|
|
broadcaster.GetName()
|
|
try:
|
|
obj.HandleProcessEvent(lldb.SBProcess(), lldb.SBEvent(), None, None)
|
|
except Exception:
|
|
pass
|
|
obj.CreateTargetWithFileAndTargetTriple("a.out", "A-B-C")
|
|
obj.CreateTargetWithFileAndArch("b.out", "arm")
|
|
obj.CreateTarget("c.out")
|
|
obj.DeleteTarget(lldb.SBTarget())
|
|
obj.GetTargetAtIndex(0xFFFFFFFF)
|
|
obj.FindTargetWithProcessID(0)
|
|
obj.FindTargetWithFileAndArch("a.out", "arm")
|
|
obj.GetNumTargets()
|
|
obj.GetSelectedTarget()
|
|
obj.GetNumPlatforms()
|
|
obj.GetPlatformAtIndex(0xFFFFFFFF)
|
|
obj.GetNumAvailablePlatforms()
|
|
obj.GetAvailablePlatformInfoAtIndex(0xFFFFFFFF)
|
|
obj.GetSourceManager()
|
|
obj.SetSelectedTarget(lldb.SBTarget())
|
|
obj.SetCurrentPlatformSDKRoot("tmp/sdk-root")
|
|
try:
|
|
obj.DispatchInput(None)
|
|
except Exception:
|
|
pass
|
|
obj.DispatchInputInterrupt()
|
|
obj.DispatchInputEndOfFile()
|
|
obj.GetInstanceName()
|
|
obj.GetDescription(lldb.SBStream())
|
|
obj.GetTerminalWidth()
|
|
obj.SetTerminalWidth(0xFFFFFFFF)
|
|
obj.GetID()
|
|
obj.GetPrompt()
|
|
obj.SetPrompt("Hi, Mom!")
|
|
obj.GetScriptLanguage()
|
|
obj.SetScriptLanguage(lldb.eScriptLanguageNone)
|
|
obj.SetScriptLanguage(lldb.eScriptLanguagePython)
|
|
obj.GetCloseInputOnEOF()
|
|
obj.SetCloseInputOnEOF(True)
|
|
obj.SetCloseInputOnEOF(False)
|
|
obj.Clear()
|
|
for target in obj:
|
|
s = str(target)
|