JDevlieghere created this revision.
JDevlieghere added a reviewer: jingham.
Herald added a project: All.
JDevlieghere requested review of this revision.

Fix a crash when trying to complete an ambiguous subcommand. Take `set s tar` 
for example: here `s` is ambiguous between `set` and `show`. Pressing TAB after 
this input currently crashes LLDB because we go look for the subcommand and 
fail to find one, but still add the original command (`s`) as a completion. 
This causes problems later on when we're trying to insert the completion and 
find that the "completed string" is shorter than the input string and call 
`std::string::substr` to eliminate the common prefix.

  frame #12: 0x0000000133fafb44 
liblldb.17.0.0git.dylib`lldb_private::Editline::TabCommand(this=0x000000010a645aa0,
 ch=9) at Editline.cpp:1044:24
     1041   std::string longest_prefix = completions.LongestCommonPrefix();
     1042   if (!longest_prefix.empty())
     1043     longest_prefix =
  -> 1044         
longest_prefix.substr(request.GetCursorArgumentPrefix().size());
  (lldb) v longest_prefix
  (std::string) longest_prefix = "s"
  (lldb) p request.GetCursorArgumentPrefix().size()
  (size_t) 3

rdar://111848598


https://reviews.llvm.org/D154643

Files:
  lldb/source/Commands/CommandObjectMultiword.cpp
  lldb/test/API/functionalities/completion/TestCompletion.py


Index: lldb/test/API/functionalities/completion/TestCompletion.py
===================================================================
--- lldb/test/API/functionalities/completion/TestCompletion.py
+++ lldb/test/API/functionalities/completion/TestCompletion.py
@@ -868,3 +868,7 @@
         self.complete_from_to("breakpoint set -N n", "breakpoint set -N n")
         self.assertTrue(bp1.AddNameWithErrorHandling("nn"))
         self.complete_from_to("breakpoint set -N ", "breakpoint set -N nn")
+
+    def test_ambiguous_option(self):
+        """Make sure we don't crash when completing ambiguous commands"""
+        self.complete_from_to("set s ta", [])
Index: lldb/source/Commands/CommandObjectMultiword.cpp
===================================================================
--- lldb/source/Commands/CommandObjectMultiword.cpp
+++ lldb/source/Commands/CommandObjectMultiword.cpp
@@ -274,10 +274,10 @@
 
   StringList new_matches;
   CommandObject *sub_command_object = GetSubcommandObject(arg0, &new_matches);
-  if (sub_command_object == nullptr) {
-    request.AddCompletions(new_matches);
+
+  // The subcommand is ambiguous. The completion isn't meaningful.
+  if (!sub_command_object)
     return;
-  }
 
   // Remove the one match that we got from calling GetSubcommandObject.
   new_matches.DeleteStringAtIndex(0);


Index: lldb/test/API/functionalities/completion/TestCompletion.py
===================================================================
--- lldb/test/API/functionalities/completion/TestCompletion.py
+++ lldb/test/API/functionalities/completion/TestCompletion.py
@@ -868,3 +868,7 @@
         self.complete_from_to("breakpoint set -N n", "breakpoint set -N n")
         self.assertTrue(bp1.AddNameWithErrorHandling("nn"))
         self.complete_from_to("breakpoint set -N ", "breakpoint set -N nn")
+
+    def test_ambiguous_option(self):
+        """Make sure we don't crash when completing ambiguous commands"""
+        self.complete_from_to("set s ta", [])
Index: lldb/source/Commands/CommandObjectMultiword.cpp
===================================================================
--- lldb/source/Commands/CommandObjectMultiword.cpp
+++ lldb/source/Commands/CommandObjectMultiword.cpp
@@ -274,10 +274,10 @@
 
   StringList new_matches;
   CommandObject *sub_command_object = GetSubcommandObject(arg0, &new_matches);
-  if (sub_command_object == nullptr) {
-    request.AddCompletions(new_matches);
+
+  // The subcommand is ambiguous. The completion isn't meaningful.
+  if (!sub_command_object)
     return;
-  }
 
   // Remove the one match that we got from calling GetSubcommandObject.
   new_matches.DeleteStringAtIndex(0);
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
  • [Lldb-commits] [PATCH] ... Jonas Devlieghere via Phabricator via lldb-commits

Reply via email to