This revision was automatically updated to reflect the committed changes.
Closed by commit rG83bd2c4a0680: Prevent GetNumChildren from transitively
walking pointer chains (authored by jarin, committed by teemperor).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D80254/new/
https://reviews.llvm.org/D80254
Files:
lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
lldb/test/API/functionalities/pointer_num_children/Makefile
lldb/test/API/functionalities/pointer_num_children/TestPointerNumChildren.py
lldb/test/API/functionalities/pointer_num_children/main.cpp
Index: lldb/test/API/functionalities/pointer_num_children/main.cpp
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/pointer_num_children/main.cpp
@@ -0,0 +1,16 @@
+struct Inner {
+ int a;
+ int b;
+};
+
+struct Outer {
+ Inner *inner;
+};
+
+int main() {
+ Inner inner{42, 56};
+ Outer outer{&inner};
+ Inner **Ptr = &(outer.inner);
+ Inner *&Ref = outer.inner;
+ return 0; // break here
+}
Index: lldb/test/API/functionalities/pointer_num_children/TestPointerNumChildren.py
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/pointer_num_children/TestPointerNumChildren.py
@@ -0,0 +1,28 @@
+"""
+Test children counts of pointer values.
+"""
+
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestPointerNumChilden(TestBase):
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_pointer_num_children(self):
+ self.build()
+ lldbutil.run_to_source_breakpoint(self, "// break here", lldb.SBFileSpec("main.cpp"))
+
+ result = self.frame().FindVariable("Ref")
+ self.assertEqual(1, result.GetNumChildren())
+ self.assertEqual(2, result.GetChildAtIndex(0).GetNumChildren())
+ self.assertEqual("42", result.GetChildAtIndex(0).GetChildAtIndex(0).GetValue())
+ self.assertEqual("56", result.GetChildAtIndex(0).GetChildAtIndex(1).GetValue())
+
+ result = self.frame().FindVariable("Ptr")
+ self.assertEqual(1, result.GetNumChildren())
+ self.assertEqual(2, result.GetChildAtIndex(0).GetNumChildren())
+ self.assertEqual("42", result.GetChildAtIndex(0).GetChildAtIndex(0).GetValue())
+ self.assertEqual("56", result.GetChildAtIndex(0).GetChildAtIndex(1).GetValue())
Index: lldb/test/API/functionalities/pointer_num_children/Makefile
===================================================================
--- /dev/null
+++ lldb/test/API/functionalities/pointer_num_children/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
===================================================================
--- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -5172,12 +5172,15 @@
}
break;
+ case clang::Type::LValueReference:
+ case clang::Type::RValueReference:
case clang::Type::ObjCObjectPointer: {
- const clang::ObjCObjectPointerType *pointer_type =
- llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr());
- clang::QualType pointee_type = pointer_type->getPointeeType();
- uint32_t num_pointee_children =
- GetType(pointee_type).GetNumChildren(omit_empty_base_classes, exe_ctx);
+ CompilerType pointee_clang_type(GetPointeeType(type));
+
+ uint32_t num_pointee_children = 0;
+ if (pointee_clang_type.IsAggregateType())
+ num_pointee_children =
+ pointee_clang_type.GetNumChildren(omit_empty_base_classes, exe_ctx);
// If this type points to a simple type, then it has 1 child
if (num_pointee_children == 0)
num_children = 1;
@@ -5209,8 +5212,11 @@
const clang::PointerType *pointer_type =
llvm::cast<clang::PointerType>(qual_type.getTypePtr());
clang::QualType pointee_type(pointer_type->getPointeeType());
- uint32_t num_pointee_children =
- GetType(pointee_type).GetNumChildren(omit_empty_base_classes, exe_ctx);
+ CompilerType pointee_clang_type(GetType(pointee_type));
+ uint32_t num_pointee_children = 0;
+ if (pointee_clang_type.IsAggregateType())
+ num_pointee_children =
+ pointee_clang_type.GetNumChildren(omit_empty_base_classes, exe_ctx);
if (num_pointee_children == 0) {
// We have a pointer to a pointee type that claims it has no children. We
// will want to look at
@@ -5219,20 +5225,6 @@
num_children = num_pointee_children;
} break;
- case clang::Type::LValueReference:
- case clang::Type::RValueReference: {
- const clang::ReferenceType *reference_type =
- llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
- clang::QualType pointee_type = reference_type->getPointeeType();
- uint32_t num_pointee_children =
- GetType(pointee_type).GetNumChildren(omit_empty_base_classes, exe_ctx);
- // If this type points to a simple type, then it has 1 child
- if (num_pointee_children == 0)
- num_children = 1;
- else
- num_children = num_pointee_children;
- } break;
-
default:
break;
}
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits