Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Prevent GetNumChildren from transitively walking pointer chains
Summary: This is an attempt to fix https://bugs.llvm.org/show_bug.cgi?id=45988, where SBValue::GetNumChildren returns 2, but SBValue::GetChildAtIndex(1) returns an invalid value sentinel. The root cause of this seems to be that GetNumChildren can return the number of children of a wrong value. In particular, for pointers GetNumChildren just recursively calls itself on the pointee type, so it effectively walks chains of pointers. This is different from the logic of GetChildAtIndex, which only recurses if pointee.IsAggregateType() returns true (IsAggregateType is false for pointers and references), so it never follows chain of pointers. This patch aims to make GetNumChildren (more) consistent with GetChildAtIndex by only recursively calling GetNumChildren for aggregate types. Ideally, GetNumChildren and GetChildAtIndex would share the code that decides which pointers/references are followed, but that is a bit more invasive change. Reviewers: teemperor, jingham, clayborg Reviewed By: teemperor, clayborg Subscribers: clayborg, labath, shafik, lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D80254
- Loading branch information
Showing
4 changed files
with
60 additions
and
21 deletions.
There are no files selected for viewing
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
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 @@ | ||
CXX_SOURCES := main.cpp | ||
|
||
include Makefile.rules |
28 changes: 28 additions & 0 deletions
28
lldb/test/API/functionalities/pointer_num_children/TestPointerNumChildren.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,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()) |
16 changes: 16 additions & 0 deletions
16
lldb/test/API/functionalities/pointer_num_children/main.cpp
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,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 | ||
} |