Skip to content

Commit 0a98b90

Browse files
committed
Address review comments
Will be squashed.
1 parent 4c8fc22 commit 0a98b90

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
@@ -182,7 +182,7 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
182182

183183
std::string struct_name;
184184
size_t member_offset;
185-
if(pointer_value.pointee.find("+") != std::string::npos)
185+
if(pointer_value.has_known_offset())
186186
{
187187
std::string member_offset_string;
188188
split_string(
@@ -204,9 +204,7 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
204204
for(const auto &value_pair : values)
205205
{
206206
const auto &value_symbol_expr = value_pair.second;
207-
if(
208-
struct_name ==
209-
id2string(to_symbol_expr(value_symbol_expr).get_identifier()))
207+
if(to_symbol_expr(value_symbol_expr).get_identifier() == struct_name)
210208
{
211209
found = true;
212210
break;
@@ -217,12 +215,14 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
217215
{
218216
const typet target_type = expr.type().subtype();
219217

220-
symbol_exprt dummy(expr.type());
218+
symbol_exprt dummy("tmp", expr.type());
221219
code_blockt assignments;
222220

223-
const symbol_exprt new_symbol =
224-
to_symbol_expr(allocate_objects.allocate_automatic_local_object(
221+
auto emplace_pair = values.emplace(
222+
memory_location,
223+
allocate_objects.allocate_automatic_local_object(
225224
assignments, dummy, target_type));
225+
const symbol_exprt &new_symbol = to_symbol_expr(emplace_pair.first->second);
226226

227227
dereference_exprt dereference_expr(expr);
228228

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

235-
values[memory_location] = new_symbol;
236-
237235
const auto &struct_symbol = values.find(memory_location);
238236

239237
const auto maybe_member_expr = get_subexpression_at_offset(
240238
struct_symbol->second, member_offset, expr.type().subtype(), ns);
241-
if(maybe_member_expr.has_value())
242-
return *maybe_member_expr;
243-
UNREACHABLE;
239+
CHECK_RETURN(maybe_member_expr.has_value());
240+
return *maybe_member_expr;
244241
}
245242

246243
const auto maybe_member_expr = get_subexpression_at_offset(
247244
struct_symbol->symbol_expr(), member_offset, expr.type().subtype(), ns);
248-
if(maybe_member_expr.has_value())
249-
return *maybe_member_expr;
250-
251-
UNREACHABLE;
245+
CHECK_RETURN(maybe_member_expr.has_value());
246+
return *maybe_member_expr;
252247
}
253248

254249
exprt gdb_value_extractort::get_non_char_pointer_value(
@@ -292,28 +287,30 @@ exprt gdb_value_extractort::get_non_char_pointer_value(
292287
}
293288
else
294289
{
295-
const symbol_exprt typed_symbol_value = symbol_exprt{
296-
to_symbol_expr(it->second).get_identifier(), expr.type().subtype()};
297-
return typed_symbol_value;
290+
const auto &known_value = it->second;
291+
const auto &expected_type = expr.type().subtype();
292+
if(known_value.type() != expected_type)
293+
{
294+
return symbol_exprt{to_symbol_expr(known_value).get_identifier(),
295+
expected_type};
296+
}
297+
return known_value;
298298
}
299299
}
300300

301301
bool gdb_value_extractort::points_to_member(
302302
const pointer_valuet &pointer_value) const
303303
{
304-
if(pointer_value.pointee.find("+") != std::string::npos)
304+
if(pointer_value.has_known_offset())
305305
return true;
306306

307307
const symbolt *pointee_symbol = symbol_table.lookup(pointer_value.pointee);
308308
if(pointee_symbol == nullptr)
309309
return false;
310-
const auto pointee_type = pointee_symbol->type;
311-
if(
312-
pointee_type.id() == ID_struct_tag || pointee_type.id() == ID_union_tag ||
313-
pointee_type.id() == ID_array || pointee_type.id() == ID_struct ||
314-
pointee_type.id() == ID_union)
315-
return true;
316-
return false;
310+
const auto &pointee_type = pointee_symbol->type;
311+
return pointee_type.id() == ID_struct_tag ||
312+
pointee_type.id() == ID_union_tag || pointee_type.id() == ID_array ||
313+
pointee_type.id() == ID_struct || pointee_type.id() == ID_union;
317314
}
318315

319316
exprt gdb_value_extractort::get_pointer_value(
@@ -486,23 +483,12 @@ exprt gdb_value_extractort::get_union_value(
486483
exprt new_expr(zero_expr);
487484

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

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

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)