[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