Skip to content

Commit a5321d6

Browse files
committed
Value-set-dereference: generate let expressions for complex pointers
For the time being symex always lifts these immediately, to avoid having to teach all elements of cbmc about the let expression.
1 parent ebeba0b commit a5321d6

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

src/goto-symex/symex_clean_expr.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ void goto_symext::process_array_expr(statet &state, exprt &expr)
128128
ns, state.symbol_table, symex_dereference_state, language_mode, false);
129129

130130
expr = dereference.dereference(expr);
131+
lift_lets(state, expr, symex_targett::assignment_typet::STATE);
131132

132133
::process_array_expr(expr, symex_config.simplify_opt, ns);
133134
}
@@ -222,6 +223,7 @@ void goto_symext::clean_expr(
222223
{
223224
replace_nondet(expr, path_storage.build_symex_nondet);
224225
dereference(expr, state, write);
226+
lift_lets(state, expr, symex_targett::assignment_typet::STATE);
225227

226228
// make sure all remaining byte extract operations use the root
227229
// object to avoid nesting of with/update and byte_update when on

src/pointer-analysis/value_set_dereference.cpp

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,24 @@ exprt value_set_dereferencet::dereference(const exprt &pointer)
7676

7777
std::list<valuet> values;
7878

79+
exprt compare_against_pointer = pointer;
80+
81+
if(pointer.id() != ID_symbol && retained_values.size() >= 2)
82+
{
83+
symbolt fresh_binder = get_fresh_aux_symbol(
84+
pointer.type(),
85+
"derefd_pointer",
86+
"derefd_pointer",
87+
source_locationt(),
88+
language_mode,
89+
new_symbol_table);
90+
91+
compare_against_pointer = fresh_binder.symbol_expr();
92+
}
93+
7994
for(const auto &value : retained_values)
8095
{
81-
values.push_back(build_reference_to(value, pointer, ns));
96+
values.push_back(build_reference_to(value, compare_against_pointer, ns));
8297
#if 0
8398
std::cout << "V: " << format(value.pointer_guard) << " --> ";
8499
std::cout << format(value.value);
@@ -160,9 +175,12 @@ exprt value_set_dereferencet::dereference(const exprt &pointer)
160175
}
161176
}
162177

163-
#if 0
178+
if(compare_against_pointer != pointer)
179+
value = let_exprt(to_symbol_expr(compare_against_pointer), pointer, value);
180+
181+
#if 0
164182
std::cout << "R: " << format(value) << "\n\n";
165-
#endif
183+
#endif
166184

167185
return value;
168186
}

0 commit comments

Comments
 (0)