[Lldb-commits] [PATCH] D154643: [lldb] Prevent crash when completing ambiguous subcommands
Jonas Devlieghere via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 6 12:25:35 PDT 2023
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);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D154643.537829.patch
Type: text/x-patch
Size: 1327 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20230706/1d429b2b/attachment.bin>
More information about the lldb-commits
mailing list