This revision was not accepted when it landed; it landed in state "Needs 
Review".
This revision was automatically updated to reflect the committed changes.
Closed by commit rL338177: Add missing boundary checks to variable completion. 
(authored by teemperor, committed by ).
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D49949?vs=157803&id=157805#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D49949

Files:
  
lldb/trunk/packages/Python/lldbsuite/test/functionalities/completion/TestCompletion.py
  lldb/trunk/packages/Python/lldbsuite/test/functionalities/completion/main.cpp
  lldb/trunk/source/Symbol/Variable.cpp

Index: lldb/trunk/source/Symbol/Variable.cpp
===================================================================
--- lldb/trunk/source/Symbol/Variable.cpp
+++ lldb/trunk/source/Symbol/Variable.cpp
@@ -644,11 +644,12 @@
       break;
 
     case '-':
-      if (partial_path[1] == '>' && !prefix_path.str().empty()) {
+      if (partial_path.size() > 1 && partial_path[1] == '>' &&
+          !prefix_path.str().empty()) {
         switch (type_class) {
         case lldb::eTypeClassPointer: {
           CompilerType pointee_type(compiler_type.GetPointeeType());
-          if (partial_path[2]) {
+          if (partial_path.size() > 2 && partial_path[2]) {
             // If there is more after the "->", then search deeper
             PrivateAutoComplete(
                 frame, partial_path.substr(2), prefix_path + "->",
@@ -672,7 +673,7 @@
         case lldb::eTypeClassUnion:
         case lldb::eTypeClassStruct:
         case lldb::eTypeClassClass:
-          if (partial_path[1]) {
+          if (partial_path.size() > 1 && partial_path[1]) {
             // If there is more after the ".", then search deeper
             PrivateAutoComplete(frame, partial_path.substr(1),
                                 prefix_path + ".", compiler_type, matches,
Index: lldb/trunk/packages/Python/lldbsuite/test/functionalities/completion/main.cpp
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/completion/main.cpp
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/completion/main.cpp
@@ -7,8 +7,15 @@
     }
 };
 
+struct Container { int MemberVar; };
+
 int main()
 {
-    Foo f;
-    f.Bar(1, 2);
+    Foo fooo;
+    Foo *ptr_fooo = &fooo;
+    fooo.Bar(1, 2);
+
+    Container container;
+    Container *ptr_container = &container;
+    return container.MemberVar = 3; // Break here
 }
Index: lldb/trunk/packages/Python/lldbsuite/test/functionalities/completion/TestCompletion.py
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/completion/TestCompletion.py
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/completion/TestCompletion.py
@@ -39,6 +39,46 @@
         self.complete_from_to('de', 'detach ')
 
     @skipIfFreeBSD  # timing out on the FreeBSD buildbot
+    def test_frame_variable(self):
+        self.build()
+        self.main_source = "main.cpp"
+        self.main_source_spec = lldb.SBFileSpec(self.main_source)
+        self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
+
+        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self,
+                                          '// Break here', self.main_source_spec)
+        self.assertEquals(process.GetState(), lldb.eStateStopped)
+        # FIXME: This pulls in the debug information to make the completions work,
+        # but the completions should also work without.
+        self.runCmd("frame variable fooo")
+
+        self.complete_from_to('frame variable fo',
+                              'frame variable fooo')
+        self.complete_from_to('frame variable fooo.',
+                              'frame variable fooo.')
+        self.complete_from_to('frame variable fooo.dd',
+                              'frame variable fooo.dd')
+
+        self.complete_from_to('frame variable ptr_fooo->',
+                              'frame variable ptr_fooo->')
+        self.complete_from_to('frame variable ptr_fooo->dd',
+                              'frame variable ptr_fooo->dd')
+
+        self.complete_from_to('frame variable cont',
+                              'frame variable container')
+        self.complete_from_to('frame variable container.',
+                              'frame variable container.MemberVar')
+        self.complete_from_to('frame variable container.Mem',
+                              'frame variable container.MemberVar')
+
+        self.complete_from_to('frame variable ptr_cont',
+                              'frame variable ptr_container')
+        self.complete_from_to('frame variable ptr_container->',
+                              'frame variable ptr_container->MemberVar')
+        self.complete_from_to('frame variable ptr_container->Mem',
+                              'frame variable ptr_container->MemberVar')
+
+    @skipIfFreeBSD  # timing out on the FreeBSD buildbot
     def test_process_attach_dash_dash_con(self):
         """Test that 'process attach --con' completes to 'process attach --continue '."""
         self.complete_from_to(
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to