@@ -91,6 +91,13 @@ optionalt<std::string> gdb_value_extractort::get_malloc_pointee(
91
91
(pointer_distance > 0 ? " +" + integer2string (pointer_distance) : " " );
92
92
}
93
93
94
+ mp_integer gdb_value_extractort::get_type_size (const typet &type) const
95
+ {
96
+ const auto maybe_size = pointer_offset_bits (type, ns);
97
+ CHECK_RETURN (maybe_size.has_value ());
98
+ return *maybe_size / 8 ;
99
+ }
100
+
94
101
void gdb_value_extractort::analyze_symbols (
95
102
const std::vector<std::string> &symbols)
96
103
{
@@ -433,11 +440,22 @@ exprt gdb_value_extractort::get_non_char_pointer_value(
433
440
}
434
441
435
442
bool gdb_value_extractort::points_to_member (
436
- const pointer_valuet &pointer_value) const
443
+ pointer_valuet &pointer_value,
444
+ const typet &expected_type)
437
445
{
438
446
if (pointer_value.pointee .find (" +" ) != std::string::npos)
439
447
return true ;
440
448
449
+ if (pointer_value.pointee .empty ())
450
+ {
451
+ const auto maybe_pointee = get_malloc_pointee (
452
+ pointer_value.address , get_type_size (expected_type.subtype ()));
453
+ if (maybe_pointee.has_value ())
454
+ pointer_value.pointee = *maybe_pointee;
455
+ if (pointer_value.pointee .find (" +" ) != std::string::npos)
456
+ return true ;
457
+ }
458
+
441
459
const symbolt *pointee_symbol = symbol_table.lookup (pointer_value.pointee );
442
460
if (pointee_symbol == nullptr )
443
461
return false ;
@@ -470,7 +488,7 @@ exprt gdb_value_extractort::get_pointer_value(
470
488
if (!memory_location.is_null ())
471
489
{
472
490
// pointers-to-char can point to members as well, e.g. char[]
473
- if (points_to_member (value))
491
+ if (points_to_member (value, expr. type () ))
474
492
{
475
493
const auto target_expr =
476
494
get_pointer_to_member_value (expr, value, location);
0 commit comments