[Lldb-commits] [lldb] r367308 - [lldb] Fix crash when tab-completing in multi-line expr
Hans Wennborg via lldb-commits
lldb-commits at lists.llvm.org
Tue Jul 30 05:53:32 PDT 2019
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
<teemperor at 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 at 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 at lists.llvm.org
> > https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
More information about the lldb-commits
mailing list