Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[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 llvm-svn: 367308
- Loading branch information
Showing
4 changed files
with
61 additions
and
1 deletion.
There are no files selected for viewing
3 changes: 3 additions & 0 deletions
3
lldb/packages/Python/lldbsuite/test/expression_command/multiline-completion/Makefile
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
LEVEL = ../../make | ||
C_SOURCES := main.c | ||
include $(LEVEL)/Makefile.rules |
52 changes: 52 additions & 0 deletions
52
.../Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() |
5 changes: 5 additions & 0 deletions
5
lldb/packages/Python/lldbsuite/test/expression_command/multiline-completion/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
int main(int argc, char **argv) { | ||
lldb_enable_attach(); | ||
int to_complete = 0; | ||
return to_complete; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters