[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