Skip to content

Commit b056982

Browse files
Use symex_value_sett instead of value_sett in symex
This ensures that in symex the value set are always indexed using l1 renamed symbols.
1 parent cfe5eb5 commit b056982

10 files changed

+47
-35
lines changed

src/goto-symex/goto_state.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,11 @@ void goto_statet::apply_condition(
104104
else if(propagation_entry->get() != rhs)
105105
propagation.replace(l1_identifier, rhs);
106106

107-
value_set.assign(l1_lhs, rhs, ns, true, false);
107+
auto l1_lhs_checked = check_l1_renaming(l1_lhs);
108+
CHECK_RETURN(l1_lhs_checked);
109+
auto l1_rhs_checked = check_l1_renaming(rhs);
110+
CHECK_RETURN(l1_rhs_checked);
111+
value_set.assign(*l1_lhs_checked, *l1_rhs_checked, ns, true, false);
108112
}
109113
}
110114
}

src/goto-symex/goto_state.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Author: Romain Brenguier, [email protected]
1919
#include <pointer-analysis/value_set.h>
2020

2121
#include "renaming_level.h"
22+
#include "symex_value_set.h"
2223

2324
/// Container for data that varies per program point, e.g. the constant
2425
/// propagator state, when state needs to branch. This is copied out of
@@ -40,7 +41,7 @@ class goto_statet
4041
}
4142

4243
/// Uses level 1 names, and is used to do dereferencing
43-
value_sett value_set;
44+
symex_value_sett value_set;
4445

4546
// A guard is a particular condition that has to pass for an instruction
4647
// to be executed. The easiest example is an if/else: each instruction along

src/goto-symex/goto_symex.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -392,9 +392,9 @@ class goto_symext
392392
void try_filter_value_sets(
393393
goto_symex_statet &state,
394394
exprt condition,
395-
const value_sett &original_value_set,
396-
value_sett *jump_taken_value_set,
397-
value_sett *jump_not_taken_value_set,
395+
const symex_value_sett &original_value_set,
396+
symex_value_sett *jump_taken_value_set,
397+
symex_value_sett *jump_not_taken_value_set,
398398
const namespacet &ns);
399399

400400
virtual void vcc(

src/goto-symex/goto_symex_state.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,13 +138,13 @@ renamedt<ssa_exprt, L2> goto_symex_statet::assignment(
138138
ssa_exprt l1_lhs(lhs);
139139
l1_lhs.remove_level_2();
140140

141-
if(run_validation_checks)
142-
{
143-
DATA_INVARIANT(is_l1_renamed(l1_lhs), "lhs renaming failed on l1");
144-
DATA_INVARIANT(is_l1_renamed(l1_rhs), "rhs renaming failed on l1");
145-
}
141+
auto l1_lhs_checked = check_l1_renaming(l1_lhs);
142+
DATA_INVARIANT(l1_lhs_checked, "lhs renaming failed on l1");
143+
auto l1_rhs_checked = check_l1_renaming(l1_rhs);
144+
DATA_INVARIANT(l1_rhs_checked, "rhs renaming failed on l1");
146145

147-
value_set.assign(l1_lhs, l1_rhs, ns, rhs_is_simplified, is_shared);
146+
value_set.assign(
147+
*l1_lhs_checked, *l1_rhs_checked, ns, rhs_is_simplified, is_shared);
148148
}
149149

150150
#if 0

src/goto-symex/symex_assign.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,9 @@ void goto_symext::symex_assign_symbol(
508508
// have it in the propagation table and the value set while doing the field
509509
// assignments, thus we cannot skip putting it in there above.
510510
state.propagation.erase_if_exists(l1_lhs.get_identifier());
511-
state.value_set.erase_symbol(l1_lhs, ns);
511+
auto l1_lhs_checked = check_l1_renaming(l1_lhs);
512+
CHECK_RETURN(l1_lhs_checked);
513+
state.value_set.erase_symbol(*l1_lhs_checked, ns);
512514
}
513515
}
514516

src/goto-symex/symex_dead.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void goto_symext::symex_dead(statet &state, const symbol_exprt &symbol_expr)
4040
// information is not local to a path, but removing it from the propagation
4141
// map and value-set is safe as 1) it is local to a path and 2) this
4242
// instance can no longer appear.
43-
state.value_set.values.erase_if_exists(l1_identifier);
43+
state.value_set.erase_if_exists(l1_identifier);
4444
state.propagation.erase_if_exists(l1_identifier);
4545
// Remove from the local L2 renaming map; this means any reads from the dead
4646
// identifier will use generation 0 (e.g. x!N@M#0, where N and M are

src/goto-symex/symex_decl.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
5959
else
6060
rhs=exprt(ID_invalid);
6161

62-
exprt l1_rhs = state.rename<L1>(std::move(rhs), ns).get();
63-
state.value_set.assign(ssa, l1_rhs, ns, true, false);
62+
renamedt<exprt, L1> l1_rhs = state.rename<L1>(std::move(rhs), ns);
63+
auto l1_ssa = check_l1_renaming(ssa);
64+
CHECK_RETURN(l1_ssa.has_value());
65+
state.value_set.assign(*l1_ssa, l1_rhs, ns, true, false);
6466
}
6567

6668
// L2 renaming

src/goto-symex/symex_dereference_state.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ void symex_dereference_statet::get_value_set(
8686
const exprt &expr,
8787
value_setst::valuest &value_set) const
8888
{
89-
state.value_set.get_value_set(expr, value_set, ns);
89+
auto l1_expr = check_l1_renaming(expr);
90+
CHECK_RETURN(l1_expr);
91+
for(const auto e : state.value_set.get_value_set(*l1_expr, ns))
92+
value_set.push_back(e);
9093

9194
#ifdef DEBUG
9295
std::cout << "symex_dereference_statet state.value_set={\n";
@@ -112,5 +115,7 @@ void symex_dereference_statet::get_value_set(
112115
std::vector<exprt>
113116
symex_dereference_statet::get_value_set(const exprt &expr) const
114117
{
115-
return state.value_set.get_value_set(expr, ns);
118+
auto l1_expr = check_l1_renaming(expr);
119+
CHECK_RETURN(l1_expr);
120+
return state.value_set.get_value_set(*l1_expr, ns);
116121
}

src/goto-symex/symex_goto.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ static optionalt<renamedt<exprt, L2>> try_evaluate_pointer_comparison(
8383
const irep_idt &operation,
8484
const symbol_exprt &symbol_expr,
8585
const exprt &other_operand,
86-
const value_sett &value_set,
86+
const symex_value_sett &value_set,
8787
const irep_idt language_mode,
8888
const namespacet &ns)
8989
{
@@ -102,8 +102,10 @@ static optionalt<renamedt<exprt, L2>> try_evaluate_pointer_comparison(
102102

103103
ssa_exprt l1_expr{*ssa_symbol_expr};
104104
l1_expr.remove_level_2();
105+
const auto checked_l1_expr = check_l1_renaming((exprt)l1_expr);
106+
CHECK_RETURN(checked_l1_expr);
105107
const std::vector<exprt> value_set_elements =
106-
value_set.get_value_set(l1_expr, ns);
108+
value_set.get_value_set(*checked_l1_expr, ns);
107109

108110
bool constant_found = false;
109111

@@ -169,7 +171,7 @@ static optionalt<renamedt<exprt, L2>> try_evaluate_pointer_comparison(
169171
/// return that, otherwise we return an empty optionalt
170172
static optionalt<renamedt<exprt, L2>> try_evaluate_pointer_comparison(
171173
const renamedt<exprt, L2> &renamed_expr,
172-
const value_sett &value_set,
174+
const symex_value_sett &value_set,
173175
const irep_idt &language_mode,
174176
const namespacet &ns)
175177
{
@@ -200,7 +202,7 @@ static optionalt<renamedt<exprt, L2>> try_evaluate_pointer_comparison(
200202

201203
renamedt<exprt, L2> try_evaluate_pointer_comparisons(
202204
renamedt<exprt, L2> condition,
203-
const value_sett &value_set,
205+
const symex_value_sett &value_set,
204206
const irep_idt &language_mode,
205207
const namespacet &ns)
206208
{

src/goto-symex/symex_main.cpp

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -689,9 +689,9 @@ find_unique_pointer_typed_symbol(const exprt &expr)
689689
void goto_symext::try_filter_value_sets(
690690
goto_symex_statet &state,
691691
exprt condition,
692-
const value_sett &original_value_set,
693-
value_sett *jump_taken_value_set,
694-
value_sett *jump_not_taken_value_set,
692+
const symex_value_sett &original_value_set,
693+
symex_value_sett *jump_taken_value_set,
694+
symex_value_sett *jump_not_taken_value_set,
695695
const namespacet &ns)
696696
{
697697
condition = state.rename<L1>(std::move(condition), ns).get();
@@ -704,10 +704,10 @@ void goto_symext::try_filter_value_sets(
704704
return;
705705
}
706706

707-
const pointer_typet &symbol_type = to_pointer_type(symbol_expr->type());
708-
707+
const auto l1_symbol_expr = check_l1_renaming(*symbol_expr);
708+
CHECK_RETURN(l1_symbol_expr);
709709
const std::vector<exprt> value_set_elements =
710-
original_value_set.get_value_set(*symbol_expr, ns);
710+
original_value_set.get_value_set(*l1_symbol_expr, ns);
711711

712712
std::unordered_set<exprt, irep_hash> erase_from_jump_taken_value_set;
713713
std::unordered_set<exprt, irep_hash> erase_from_jump_not_taken_value_set;
@@ -775,16 +775,12 @@ void goto_symext::try_filter_value_sets(
775775
}
776776
if(jump_taken_value_set && !erase_from_jump_taken_value_set.empty())
777777
{
778-
auto entry_index = jump_taken_value_set->get_index_of_symbol(
779-
symbol_expr->get_identifier(), symbol_type, "", ns);
780-
jump_taken_value_set->erase_values_from_entry(
781-
*entry_index, erase_from_jump_taken_value_set);
778+
jump_taken_value_set->erase(
779+
*symbol_expr, ns, erase_from_jump_taken_value_set);
782780
}
783781
if(jump_not_taken_value_set && !erase_from_jump_not_taken_value_set.empty())
784782
{
785-
auto entry_index = jump_not_taken_value_set->get_index_of_symbol(
786-
symbol_expr->get_identifier(), symbol_type, "", ns);
787-
jump_not_taken_value_set->erase_values_from_entry(
788-
*entry_index, erase_from_jump_not_taken_value_set);
783+
jump_not_taken_value_set->erase(
784+
*symbol_expr, ns, erase_from_jump_not_taken_value_set);
789785
}
790786
}

0 commit comments

Comments
 (0)