@@ -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
@@ -113,14 +120,13 @@ void gdb_value_extractort::analyze_symbols(const std::vector<irep_idt> &symbols)
113
120
values.insert ({value.address , symbol_expr});
114
121
115
122
const symbolt &symbol = ns.lookup (id);
116
- const symbol_exprt actual_expr = symbol.symbol_expr ();
117
- if (actual_expr.type ().id () != ID_pointer)
123
+ if (symbol.type .id () != ID_pointer)
118
124
{
119
- memory_map[id2string (id) ] = value;
125
+ memory_map[id ] = value;
120
126
continue ;
121
127
}
122
128
123
- const std::string c_symbol = c_converter.convert (actual_expr );
129
+ const std::string c_symbol = c_converter.convert (symbol. symbol_expr () );
124
130
const pointer_valuet &symbol_value = gdb_api.get_memory (c_symbol);
125
131
size_t symbol_size = gdb_api.query_malloc_size (c_symbol);
126
132
@@ -285,29 +291,30 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
285
291
const symbolt *struct_symbol = symbol_table.lookup (struct_name);
286
292
DATA_INVARIANT (struct_symbol != nullptr , " unknown struct" );
287
293
288
- if (memory_map. count (struct_name) == 0 )
294
+ if (! has_known_memory_location (struct_name))
289
295
{
290
296
memory_map[struct_name] = gdb_api.get_memory (struct_name);
291
297
analyze_symbol (irep_idt{struct_name});
292
298
}
293
299
294
- if (struct_symbol->symbol_expr ().type ().id () == ID_array)
300
+ const auto &struct_symbol_expr = struct_symbol->symbol_expr ();
301
+ if (struct_symbol->type .id () == ID_array)
295
302
{
296
303
return index_exprt{
297
- struct_symbol-> symbol_expr () ,
304
+ struct_symbol_expr ,
298
305
from_integer (
299
306
member_offset / get_type_size (expr.type ().subtype ()), index_type ())};
300
307
}
301
- if (struct_symbol->symbol_expr (). type () .id () == ID_pointer)
308
+ if (struct_symbol->type .id () == ID_pointer)
302
309
{
303
310
return dereference_exprt{
304
- plus_exprt{struct_symbol-> symbol_expr () ,
311
+ plus_exprt{struct_symbol_expr ,
305
312
from_integer (member_offset, size_type ()),
306
313
expr.type ()}};
307
314
}
308
315
309
316
const auto maybe_member_expr = get_subexpression_at_offset (
310
- struct_symbol-> symbol_expr () , member_offset, expr.type ().subtype (), ns);
317
+ struct_symbol_expr , member_offset, expr.type ().subtype (), ns);
311
318
DATA_INVARIANT (
312
319
maybe_member_expr.has_value (), " structure doesn't have member" );
313
320
0 commit comments