@@ -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 (const std::vector<irep_idt> &symbols)
95
102
{
96
103
// record addresses of given symbols
@@ -431,11 +438,22 @@ exprt gdb_value_extractort::get_non_char_pointer_value(
431
438
}
432
439
433
440
bool gdb_value_extractort::points_to_member (
434
- const pointer_valuet &pointer_value) const
441
+ pointer_valuet &pointer_value,
442
+ const typet &expected_type)
435
443
{
436
444
if (pointer_value.has_known_offset ())
437
445
return true ;
438
446
447
+ if (pointer_value.pointee .empty ())
448
+ {
449
+ const auto maybe_pointee = get_malloc_pointee (
450
+ pointer_value.address , get_type_size (expected_type.subtype ()));
451
+ if (maybe_pointee.has_value ())
452
+ pointer_value.pointee = *maybe_pointee;
453
+ if (pointer_value.pointee .find (" +" ) != std::string::npos)
454
+ return true ;
455
+ }
456
+
439
457
const symbolt *pointee_symbol = symbol_table.lookup (pointer_value.pointee );
440
458
if (pointee_symbol == nullptr )
441
459
return false ;
@@ -465,7 +483,7 @@ exprt gdb_value_extractort::get_pointer_value(
465
483
if (!memory_location.is_null ())
466
484
{
467
485
// pointers-to-char can point to members as well, e.g. char[]
468
- if (points_to_member (value))
486
+ if (points_to_member (value, expr. type () ))
469
487
{
470
488
const auto target_expr =
471
489
get_pointer_to_member_value (expr, value, location);
0 commit comments