Hi Raphael, Since this just landed, let's have it bake in trunk a little bit, and then I'll merge it.
Thanks, Hans On Tue, Jul 30, 2019 at 2:36 PM Raphael “Teemperor” Isemann <teempe...@gmail.com> wrote: > > Hi Hans, > > Can you cherry-pick this to the 9.0 release? The issue is really easy to hit > when using LLDB and the fix is obvious&safe. > > Thanks! > - Raphael > > > On Jul 30, 2019, at 2:31 PM, Raphael Isemann via lldb-commits > > <lldb-commits@lists.llvm.org> wrote: > > > > Author: teemperor > > Date: Tue Jul 30 05:31:24 2019 > > New Revision: 367308 > > > > URL: http://llvm.org/viewvc/llvm-project?rev=367308&view=rev > > Log: > > [lldb] Fix crash when tab-completing in multi-line expr > > > > Summary: > > Tab completing inside the multiline expression command can cause LLDB to > > crash. The easiest way > > to do this is to go inside a frame with at least one local variable and > > then try to complete: > > > > (lldb) expr > > 1. a[tab] > > > > Reason for this was some mixup when we calculate the cursor position. > > Obviously we should calculate > > the offset inside the string by doing 'end - start', but we are doing > > 'start - end' (which causes the offset to > > become -1 which will lead to some out-of-bounds reading). > > > > Fixes rdar://51754005 > > > > I don't see any way to test this as the *multiline* expression completion > > is completely untested at the moment > > and I don't think we have any existing code for testing infrastructure for > > it. > > > > Reviewers: shafik, davide, labath > > > > Reviewed By: labath > > > > Subscribers: abidh, lldb-commits, davide, clayborg, labath > > > > Tags: #lldb > > > > Differential Revision: https://reviews.llvm.org/D64995 > > > > Added: > > > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/ > > > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/Makefile > > > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py > > > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/main.c > > Modified: > > lldb/trunk/source/Core/IOHandler.cpp > > > > Added: > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/Makefile > > URL: > > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/Makefile?rev=367308&view=auto > > ============================================================================== > > --- > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/Makefile > > (added) > > +++ > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/Makefile > > Tue Jul 30 05:31:24 2019 > > @@ -0,0 +1,3 @@ > > +LEVEL = ../../make > > +C_SOURCES := main.c > > +include $(LEVEL)/Makefile.rules > > > > Added: > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py > > URL: > > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py?rev=367308&view=auto > > ============================================================================== > > --- > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py > > (added) > > +++ > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py > > Tue Jul 30 05:31:24 2019 > > @@ -0,0 +1,52 @@ > > +""" > > +Test completion for multiline expressions. > > +""" > > + > > +import lldb > > +from lldbsuite.test.decorators import * > > +from lldbsuite.test.lldbtest import * > > + > > +class MultilineCompletionTest(TestBase): > > + > > + mydir = TestBase.compute_mydir(__file__) > > + NO_DEBUG_INFO_TESTCASE = True > > + > > + def setUp(self): > > + TestBase.setUp(self) > > + self.source = 'main.c' > > + > > + def expect_string(self, string): > > + import pexpect > > + """This expects for "string", with timeout & EOF being test > > fails.""" > > + try: > > + self.child.expect_exact(string) > > + except pexpect.EOF: > > + self.fail("Got EOF waiting for '%s'" % (string)) > > + except pexpect.TIMEOUT: > > + self.fail("Timed out waiting for '%s'" % (string)) > > + > > + @expectedFailureAll( > > + oslist=["windows"], > > + bugnumber="llvm.org/pr22274: need a pexpect replacement for > > windows") > > + def test_basic_completion(self): > > + """Test that we can complete a simple multiline expression""" > > + self.build() > > + self.setTearDownCleanup() > > + > > + import pexpect > > + exe = self.getBuildArtifact("a.out") > > + prompt = "(lldb) " > > + > > + run_commands = ' -o "b main" -o "r"' > > + self.child = pexpect.spawn( > > + '%s %s %s %s' % > > + (lldbtest_config.lldbExec, self.lldbOption, run_commands, exe)) > > + child = self.child > > + > > + self.expect_string(prompt) > > + self.child.sendline("expr") > > + self.expect_string("terminate with an empty line to evaluate") > > + self.child.send("to_\t") > > + self.expect_string("to_complete") > > + > > + self.deletePexpectChild() > > > > Added: > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/main.c > > URL: > > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/main.c?rev=367308&view=auto > > ============================================================================== > > --- > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/main.c > > (added) > > +++ > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/main.c > > Tue Jul 30 05:31:24 2019 > > @@ -0,0 +1,5 @@ > > +int main(int argc, char **argv) { > > + lldb_enable_attach(); > > + int to_complete = 0; > > + return to_complete; > > +} > > > > Modified: lldb/trunk/source/Core/IOHandler.cpp > > URL: > > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/IOHandler.cpp?rev=367308&r1=367307&r2=367308&view=diff > > ============================================================================== > > --- lldb/trunk/source/Core/IOHandler.cpp (original) > > +++ lldb/trunk/source/Core/IOHandler.cpp Tue Jul 30 05:31:24 2019 > > @@ -233,7 +233,7 @@ int IOHandlerDelegate::IOHandlerComplete > > matches, descriptions); > > case Completion::Expression: { > > CompletionResult result; > > - CompletionRequest request(current_line, current_line - cursor, > > + CompletionRequest request(current_line, cursor - current_line, > > skip_first_n_matches, max_matches, result); > > CommandCompletions::InvokeCommonCompletionCallbacks( > > io_handler.GetDebugger().GetCommandInterpreter(), > > > > > > _______________________________________________ > > lldb-commits mailing list > > lldb-commits@lists.llvm.org > > https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits > _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits