@@ -31,21 +31,28 @@ gdb_value_extractort::gdb_value_extractort(
31
31
{
32
32
}
33
33
34
- bool gdb_value_extractort::memory_scopet::contains (
34
+ gdb_value_extractort::memory_scopet::memory_scopet (
35
+ const memory_addresst &begin,
36
+ const mp_integer &byte_size,
37
+ const irep_idt &name)
38
+ : begin_int(safe_string2size_t (begin.address_string, 0 )),
39
+ byte_size(byte_size),
40
+ name(name)
41
+ {
42
+ }
43
+
44
+ size_t gdb_value_extractort::memory_scopet::address2size_t (
35
45
const memory_addresst &point) const
36
46
{
37
- size_t begin_int = std::strtoul (begin.address_string .c_str (), NULL , 0 );
38
- size_t point_int = std::strtoul (point.address_string .c_str (), NULL , 0 );
39
- return point_int >= begin_int && (begin_int + byte_size) > point_int;
47
+ return safe_string2size_t (point.address_string , 0 );
40
48
}
41
49
42
50
mp_integer gdb_value_extractort::memory_scopet::distance (
43
51
const memory_addresst &point,
44
52
mp_integer member_size) const
45
53
{
46
- CHECK_RETURN (contains (point));
47
- size_t begin_int = std::strtoul (begin.address_string .c_str (), NULL , 0 );
48
- size_t point_int = std::strtoul (point.address_string .c_str (), NULL , 0 );
54
+ auto point_int = address2size_t (point);
55
+ CHECK_RETURN (check_containment (point_int));
49
56
return (point_int - begin_int) / member_size;
50
57
}
51
58
@@ -55,7 +62,7 @@ gdb_value_extractort::find_dynamic_allocation(irep_idt name)
55
62
return std::find_if (
56
63
dynamically_allocated.begin (),
57
64
dynamically_allocated.end (),
58
- [&name](const memory_scopet &scope) { return scope.name == name; });
65
+ [&name](const memory_scopet &scope) { return scope.id () == name; });
59
66
}
60
67
61
68
std::vector<gdb_value_extractort::memory_scopet>::iterator
@@ -75,7 +82,7 @@ optionalt<mp_integer> gdb_value_extractort::get_malloc_size(irep_idt name)
75
82
if (scope_it == dynamically_allocated.end ())
76
83
return {};
77
84
else
78
- return scope_it->byte_size ;
85
+ return scope_it->size () ;
79
86
}
80
87
81
88
optionalt<std::string> gdb_value_extractort::get_malloc_pointee (
@@ -87,7 +94,7 @@ optionalt<std::string> gdb_value_extractort::get_malloc_pointee(
87
94
return {};
88
95
89
96
const auto pointer_distance = scope_it->distance (point, member_size);
90
- return id2string (scope_it->name ) +
97
+ return id2string (scope_it->id () ) +
91
98
(pointer_distance > 0 ? " +" + integer2string (pointer_distance) : " " );
92
99
}
93
100
@@ -114,14 +121,13 @@ void gdb_value_extractort::analyze_symbols(
114
121
values.insert ({value.address , symbol_expr});
115
122
116
123
const symbolt &symbol = ns.lookup (id);
117
- const symbol_exprt actual_expr = symbol.symbol_expr ();
118
- if (actual_expr.type ().id () != ID_pointer)
124
+ if (symbol.type .id () != ID_pointer)
119
125
{
120
- memory_map[id2string (id) ] = value;
126
+ memory_map[id ] = value;
121
127
continue ;
122
128
}
123
129
124
- const std::string c_symbol = c_converter.convert (actual_expr );
130
+ const std::string c_symbol = c_converter.convert (symbol. symbol_expr () );
125
131
const pointer_valuet &symbol_value = gdb_api.get_memory (c_symbol);
126
132
size_t symbol_size = gdb_api.query_malloc_size (c_symbol);
127
133
@@ -287,29 +293,30 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
287
293
const symbolt *struct_symbol = symbol_table.lookup (struct_name);
288
294
DATA_INVARIANT (struct_symbol != nullptr , " unknown struct" );
289
295
290
- if (memory_map. count (struct_name) == 0 )
296
+ if (! has_known_memory_location (struct_name))
291
297
{
292
298
memory_map[struct_name] = gdb_api.get_memory (struct_name);
293
299
analyze_symbol (irep_idt{struct_name});
294
300
}
295
301
296
- if (struct_symbol->symbol_expr ().type ().id () == ID_array)
302
+ const auto &struct_symbol_expr = struct_symbol->symbol_expr ();
303
+ if (struct_symbol->type .id () == ID_array)
297
304
{
298
305
return index_exprt{
299
- struct_symbol-> symbol_expr () ,
306
+ struct_symbol_expr ,
300
307
from_integer (
301
308
member_offset / get_type_size (expr.type ().subtype ()), index_type ())};
302
309
}
303
- if (struct_symbol->symbol_expr (). type () .id () == ID_pointer)
310
+ if (struct_symbol->type .id () == ID_pointer)
304
311
{
305
312
return dereference_exprt{
306
- plus_exprt{struct_symbol-> symbol_expr () ,
313
+ plus_exprt{struct_symbol_expr ,
307
314
from_integer (member_offset, size_type ()),
308
315
expr.type ()}};
309
316
}
310
317
311
318
const auto maybe_member_expr = get_subexpression_at_offset (
312
- struct_symbol-> symbol_expr () , member_offset, expr.type ().subtype (), ns);
319
+ struct_symbol_expr , member_offset, expr.type ().subtype (), ns);
313
320
DATA_INVARIANT (
314
321
maybe_member_expr.has_value (), " structure doesn't have member" );
315
322
0 commit comments