Skip to content

Commit 268ef95

Browse files
committed
Special treatment for static and dynamic array members
If pointer points inside static array we build index_expr. If pointer points inside dynamic array we build dereference_expr.
1 parent 068c587 commit 268ef95

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

src/memory-analyzer/analyze_symbol.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
299299
}
300300

301301
if(!found)
302+
if(struct_symbol->symbol_expr().type().id() == ID_array)
302303
{
303304
const typet target_type = expr.type().subtype();
304305

@@ -323,15 +324,21 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
323324

324325
const auto maybe_member_expr = get_subexpression_at_offset(
325326
struct_symbol->second, member_offset, expr.type().subtype(), ns);
326-
CHECK_RETURN(maybe_member_expr.has_value());
327-
return *maybe_member_expr;
327+
if(maybe_member_expr.has_value())
328+
return *maybe_member_expr;
329+
UNREACHABLE;
330+
return index_exprt{
331+
struct_symbol->symbol_expr(),
332+
from_integer(
333+
member_offset / get_type_size(expr.type().subtype()), index_type())};
328334
}
329335

330336
const auto it = values.find(memory_location);
331337
// if the structure we are pointing to does not exists we need to build a
332338
// temporary object for it: get the type from symbol table, query gdb for
333339
// value, allocate new object for it and then store into assignments
334340
if(it == values.end())
341+
if(struct_symbol->symbol_expr().type().id() == ID_pointer)
335342
{
336343
const auto symbol_expr = struct_symbol->symbol_expr();
337344
const auto zero = zero_initializer(symbol_expr.type(), location, ns);
@@ -347,6 +354,10 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
347354

348355
add_assignment(new_symbol, val);
349356
values[memory_location] = val;
357+
return dereference_exprt{
358+
plus_exprt{struct_symbol->symbol_expr(),
359+
from_integer(member_offset, size_type()),
360+
expr.type()}};
350361
}
351362

352363
const auto maybe_member_expr = get_subexpression_at_offset(

0 commit comments

Comments
 (0)