[Lldb-commits] [lldb] FormatManager::GetPossibleMatches assumes all ValueObjects have targets. (PR #93880)

via lldb-commits lldb-commits at lists.llvm.org
Thu May 30 14:11:33 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lldb

Author: None (jimingham)

<details>
<summary>Changes</summary>

But one made in a situation where that's impossible might only have an error, and no symbol context, so that's not necessarily true.  Check for the target's validity before using it.

Fixes issue #<!-- -->93313

---
Full diff: https://github.com/llvm/llvm-project/pull/93880.diff


2 Files Affected:

- (modified) lldb/source/DataFormatters/FormatManager.cpp (+7-1) 
- (modified) lldb/test/API/python_api/run_locker/TestRunLocker.py (+3) 


``````````diff
diff --git a/lldb/source/DataFormatters/FormatManager.cpp b/lldb/source/DataFormatters/FormatManager.cpp
index d7ba5b4b70c94..60765952760a2 100644
--- a/lldb/source/DataFormatters/FormatManager.cpp
+++ b/lldb/source/DataFormatters/FormatManager.cpp
@@ -176,8 +176,14 @@ void FormatManager::GetPossibleMatches(
     FormattersMatchCandidate::Flags current_flags, bool root_level) {
   compiler_type = compiler_type.GetTypeForFormatters();
   ConstString type_name(compiler_type.GetTypeName());
+  // A ValueObject that couldn't be made correctly won't necessarily have a
+  // target.  We aren't going to find a formatter in this case anyway, so we
+  // should just exit.
+  TargetSP target_sp = valobj.GetTargetSP();
+  if (!target_sp)
+    return;
   ScriptInterpreter *script_interpreter =
-      valobj.GetTargetSP()->GetDebugger().GetScriptInterpreter();
+      target_sp->GetDebugger().GetScriptInterpreter();
   if (valobj.GetBitfieldBitSize() > 0) {
     StreamString sstring;
     sstring.Printf("%s:%d", type_name.AsCString(), valobj.GetBitfieldBitSize());
diff --git a/lldb/test/API/python_api/run_locker/TestRunLocker.py b/lldb/test/API/python_api/run_locker/TestRunLocker.py
index 4e0dd26bff70d..2f6892c6cbbc1 100644
--- a/lldb/test/API/python_api/run_locker/TestRunLocker.py
+++ b/lldb/test/API/python_api/run_locker/TestRunLocker.py
@@ -85,6 +85,9 @@ def runlocker_test(self, stop_at_entry):
         # you aren't supposed to do while running, and that we get some
         # actual error:
         val = target.EvaluateExpression("SomethingToCall()")
+        # There was a bug [#93313] in the printing that would cause repr to crash, so I'm
+        # testing that separately.
+        self.assertIn("can't evaluate expressions when the process is running", repr(val), "repr works")
         error = val.GetError()
         self.assertTrue(error.Fail(), "Failed to run expression")
         self.assertIn(

``````````

</details>


https://github.com/llvm/llvm-project/pull/93880


More information about the lldb-commits mailing list