[Lldb-commits] [lldb] 65bab53 - [lldb][NFC] Add test for iterator invalidation during code completion.
Raphael Isemann via lldb-commits
lldb-commits at lists.llvm.org
Mon Jan 20 06:02:25 PST 2020
Author: Raphael Isemann
Date: 2020-01-20T15:01:39+01:00
New Revision: 65bab53afb8be61cddae4d8a08dd3d9572de1f66
URL: https://github.com/llvm/llvm-project/commit/65bab53afb8be61cddae4d8a08dd3d9572de1f66
DIFF: https://github.com/llvm/llvm-project/commit/65bab53afb8be61cddae4d8a08dd3d9572de1f66.diff
LOG: [lldb][NFC] Add test for iterator invalidation during code completion.
Added:
lldb/packages/Python/lldbsuite/test/commands/expression/completion-crash-invalid-iterator/Makefile
lldb/packages/Python/lldbsuite/test/commands/expression/completion-crash-invalid-iterator/TestInvalidIteratorCompletionCrash.py
lldb/packages/Python/lldbsuite/test/commands/expression/completion-crash-invalid-iterator/main.cpp
Modified:
Removed:
################################################################################
diff --git a/lldb/packages/Python/lldbsuite/test/commands/expression/completion-crash-invalid-iterator/Makefile b/lldb/packages/Python/lldbsuite/test/commands/expression/completion-crash-invalid-iterator/Makefile
new file mode 100644
index 000000000000..3d0b98f13f3d
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/commands/expression/completion-crash-invalid-iterator/Makefile
@@ -0,0 +1,2 @@
+CXX_SOURCES := main.cpp
+include Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/commands/expression/completion-crash-invalid-iterator/TestInvalidIteratorCompletionCrash.py b/lldb/packages/Python/lldbsuite/test/commands/expression/completion-crash-invalid-iterator/TestInvalidIteratorCompletionCrash.py
new file mode 100644
index 000000000000..999a15cd42f3
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/commands/expression/completion-crash-invalid-iterator/TestInvalidIteratorCompletionCrash.py
@@ -0,0 +1,21 @@
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipIf # rdar://problem/53931074
+ def test(self):
+ self.build()
+ exe = self.getBuildArtifact("a.out")
+ target = self.dbg.CreateTarget(exe)
+ callee_break = target.BreakpointCreateByName(
+ "SomeClass::SomeClass(ParamClass)", None)
+ self.assertTrue(callee_break.GetNumLocations() > 0)
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ to_complete = "e ParamClass"
+ self.dbg.GetCommandInterpreter().HandleCompletion(to_complete, len(to_complete), 0, -1, lldb.SBStringList())
diff --git a/lldb/packages/Python/lldbsuite/test/commands/expression/completion-crash-invalid-iterator/main.cpp b/lldb/packages/Python/lldbsuite/test/commands/expression/completion-crash-invalid-iterator/main.cpp
new file mode 100644
index 000000000000..225b41fa14ed
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/commands/expression/completion-crash-invalid-iterator/main.cpp
@@ -0,0 +1,22 @@
+class LoadedByParamClass {};
+struct ParamClass {
+ LoadedByParamClass some_func();
+};
+struct SomeClass {
+ // LLDB stops in the constructor and then requests
+ // possible expression completions. This will iterate over the
+ // declarations in the translation unit.
+ // The unnamed ParamClass parameter causes that LLDB will add
+ // an incomplete ParamClass decl to the translation unit which
+ // the code completion will find. Upon inspecting the ParamClass
+ // decl to see if it can be used to provide any useful completions,
+ // Clang will complete it and load all its members.
+ // This causes that its member function some_func is loaded which in turn
+ // loads the LoadedByParamClass decl. When LoadedByParamClass
+ // is created it will be added to the translation unit which
+ // will invalidate all iterators that currently iterate over
+ // the translation unit. The iterator we use for code completion
+ // is now invalidated and LLDB crashes.
+ SomeClass(ParamClass) {}
+};
+int main() { ParamClass e; SomeClass y(e); }
More information about the lldb-commits
mailing list