Skip to content

Commit 0ed7b17

Browse files
committed
Address review comments
Will be squashed.
1 parent 3cd7d79 commit 0ed7b17

File tree

2 files changed

+36
-43
lines changed

2 files changed

+36
-43
lines changed

src/memory-analyzer/analyze_symbol.cpp

Lines changed: 29 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
184184

185185
std::string struct_name;
186186
size_t member_offset;
187-
if(pointer_value.pointee.find("+") != std::string::npos)
187+
if(pointer_value.has_known_offset())
188188
{
189189
std::string member_offset_string;
190190
split_string(
@@ -206,9 +206,7 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
206206
for(const auto &value_pair : values)
207207
{
208208
const auto &value_symbol_expr = value_pair.second;
209-
if(
210-
struct_name ==
211-
id2string(to_symbol_expr(value_symbol_expr).get_identifier()))
209+
if(to_symbol_expr(value_symbol_expr).get_identifier() == struct_name)
212210
{
213211
found = true;
214212
break;
@@ -219,12 +217,14 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
219217
{
220218
const typet target_type = expr.type().subtype();
221219

222-
symbol_exprt dummy(expr.type());
220+
symbol_exprt dummy("tmp", expr.type());
223221
code_blockt assignments;
224222

225-
const symbol_exprt new_symbol =
226-
to_symbol_expr(allocate_objects.allocate_automatic_local_object(
223+
auto emplace_pair = values.emplace(
224+
memory_location,
225+
allocate_objects.allocate_automatic_local_object(
227226
assignments, dummy, target_type));
227+
const symbol_exprt &new_symbol = to_symbol_expr(emplace_pair.first->second);
228228

229229
dereference_exprt dereference_expr(expr);
230230

@@ -234,23 +234,18 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
234234
// add assignment of value to newly created symbol
235235
add_assignment(new_symbol, *zero_expr);
236236

237-
values[memory_location] = new_symbol;
238-
239237
const auto &struct_symbol = values.find(memory_location);
240238

241239
const auto maybe_member_expr = get_subexpression_at_offset(
242240
struct_symbol->second, member_offset, expr.type().subtype(), ns);
243-
if(maybe_member_expr.has_value())
244-
return *maybe_member_expr;
245-
UNREACHABLE;
241+
CHECK_RETURN(maybe_member_expr.has_value());
242+
return *maybe_member_expr;
246243
}
247244

248245
const auto maybe_member_expr = get_subexpression_at_offset(
249246
struct_symbol->symbol_expr(), member_offset, expr.type().subtype(), ns);
250-
if(maybe_member_expr.has_value())
251-
return *maybe_member_expr;
252-
253-
UNREACHABLE;
247+
CHECK_RETURN(maybe_member_expr.has_value());
248+
return *maybe_member_expr;
254249
}
255250

256251
exprt gdb_value_extractort::get_non_char_pointer_value(
@@ -294,28 +289,30 @@ exprt gdb_value_extractort::get_non_char_pointer_value(
294289
}
295290
else
296291
{
297-
const symbol_exprt typed_symbol_value = symbol_exprt{
298-
to_symbol_expr(it->second).get_identifier(), expr.type().subtype()};
299-
return typed_symbol_value;
292+
const auto &known_value = it->second;
293+
const auto &expected_type = expr.type().subtype();
294+
if(known_value.type() != expected_type)
295+
{
296+
return symbol_exprt{to_symbol_expr(known_value).get_identifier(),
297+
expected_type};
298+
}
299+
return known_value;
300300
}
301301
}
302302

303303
bool gdb_value_extractort::points_to_member(
304304
const pointer_valuet &pointer_value) const
305305
{
306-
if(pointer_value.pointee.find("+") != std::string::npos)
306+
if(pointer_value.has_known_offset())
307307
return true;
308308

309309
const symbolt *pointee_symbol = symbol_table.lookup(pointer_value.pointee);
310310
if(pointee_symbol == nullptr)
311311
return false;
312-
const auto pointee_type = pointee_symbol->type;
313-
if(
314-
pointee_type.id() == ID_struct_tag || pointee_type.id() == ID_union_tag ||
315-
pointee_type.id() == ID_array || pointee_type.id() == ID_struct ||
316-
pointee_type.id() == ID_union)
317-
return true;
318-
return false;
312+
const auto &pointee_type = pointee_symbol->type;
313+
return pointee_type.id() == ID_struct_tag ||
314+
pointee_type.id() == ID_union_tag || pointee_type.id() == ID_array ||
315+
pointee_type.id() == ID_struct || pointee_type.id() == ID_union;
319316
}
320317

321318
exprt gdb_value_extractort::get_pointer_value(
@@ -487,23 +484,12 @@ exprt gdb_value_extractort::get_union_value(
487484
exprt new_expr(zero_expr);
488485

489486
const union_tag_typet &union_tag_type = to_union_tag_type(expr.type());
490-
const union_typet union_type = ns.follow_tag(union_tag_type);
491-
492-
for(size_t i = 0; i < new_expr.operands().size(); ++i)
493-
{
494-
const union_typet::componentt &component = union_type.components()[i];
495-
496-
if(component.get_is_padding())
497-
{
498-
continue;
499-
}
500-
501-
exprt &operand = new_expr.operands()[i];
502-
member_exprt member_expr(expr, component);
503-
504-
operand = get_expr_value(member_expr, operand, location);
505-
}
487+
const union_typet &union_type = ns.follow_tag(union_tag_type);
506488

489+
CHECK_RETURN(new_expr.operands().size() == 1);
490+
const union_typet::componentt &component = union_type.components()[0];
491+
auto &operand = new_expr.operands()[0];
492+
operand = get_expr_value(member_exprt{expr, component}, operand, location);
507493
return new_expr;
508494
}
509495

src/memory-analyzer/gdb_api.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Author: Malte Mues <[email protected]>
1919
#define CPROVER_MEMORY_ANALYZER_GDB_API_H
2020
#include <unistd.h>
2121

22+
#include <algorithm>
2223
#include <exception>
2324
#include <forward_list>
2425

@@ -81,6 +82,12 @@ class gdb_apit
8182
const std::string pointee;
8283
const std::string character;
8384
const optionalt<std::string> string;
85+
86+
bool has_known_offset() const
87+
{
88+
return std::any_of(
89+
pointee.begin(), pointee.end(), [](char c) { return c == '+'; });
90+
}
8491
};
8592

8693
/// Create a new gdb process for analysing the binary indicated by the member

0 commit comments

Comments
 (0)