This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH PR gdb/16959] gdb hangs in infinite recursion
- From: Weimin Pan <weimin dot pan at oracle dot com>
- To: gdb-patches at sourceware dot org
- Date: Thu, 15 Mar 2018 18:42:27 -0600
- Subject: [PATCH PR gdb/16959] gdb hangs in infinite recursion
The original problem was fixed (see related PR 22242). But using a typedef
as the declared type for a static member variable, as commented in this PR,
is still causing gdb to get into infinite loop when printing the static
member's value. This problem can be reproduced as follows:
% cat t.cc
class A {
typedef A type;
public:
bool operator==(const type& other) { return true; }
static const type INSTANCE;
};
const A A::INSTANCE;
int main() {
A a;
if (a == A::INSTANCE) {
return -1;
}
return 0;
}
% g++ -g t.cc
% gdb -ex "start" -ex "p a" a.out
The fix is rather trivial - in cp_print_static_field(), should call
check_typedef() to get the static member's real type and use it to
check whether it's a struct or an array.
Tested on both aarch64-linux-gnu and amd64-linux-gnu. No regressions.
---
gdb/ChangeLog | 7 +++++++
gdb/cp-valprint.c | 2 +-
2 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d0a8dfd..6fd43de 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2018-02-07 Weimin Pan <weimin.pan@oracle.com>
+
+ PR gdb/16959
+ * cp-valprint.c: (cp_print_static_field) Use check_typedef() to get
+ static member's real type for TYPE_CODE_STRUCT and TYPE_CODE_ARRAY
+ comparisons.
+
2018-01-24 Pedro Alves <palves@redhat.com>
GCC PR libstdc++/83906
diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c
index 486653f..0370b56 100644
--- a/gdb/cp-valprint.c
+++ b/gdb/cp-valprint.c
@@ -633,6 +633,7 @@ cp_print_static_field (struct type *type,
return;
}
+ type = check_typedef (type);
if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
{
CORE_ADDR *first_dont_print;
@@ -658,7 +659,6 @@ cp_print_static_field (struct type *type,
addr = value_address (val);
obstack_grow (&dont_print_statmem_obstack, (char *) &addr,
sizeof (CORE_ADDR));
- type = check_typedef (type);
cp_print_value_fields (type, value_enclosing_type (val),
value_embedded_offset (val), addr,
stream, recurse, val,
--
1.7.1