Skip to content

Commit 2e48edd

Browse files
committed
Add cases handling cond_exprt wherever symex or value-set currently handles if_exprt
1 parent 2fc837c commit 2e48edd

File tree

6 files changed

+82
-1
lines changed

6 files changed

+82
-1
lines changed

src/goto-symex/build_goto_trace.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,37 @@ static exprt build_full_lhs_rec(
8989
else
9090
return std::move(tmp2);
9191
}
92+
else if(id == ID_cond)
93+
{
94+
const auto &original_cond_expr = to_cond_expr(src_original);
95+
const auto &ssa_cond_expr = to_cond_expr(src_ssa);
96+
cond_exprt result(
97+
{}, src_original.type(), original_cond_expr.is_exclusive());
98+
for(std::size_t i = 0; i < original_cond_expr.get_n_cases(); ++i)
99+
{
100+
exprt condition =
101+
decision_procedure.get(to_cond_expr(src_ssa).condition(i));
102+
if(condition.is_false())
103+
continue;
104+
105+
exprt value = build_full_lhs_rec(
106+
decision_procedure,
107+
ns,
108+
original_cond_expr.value(i),
109+
ssa_cond_expr.value(i));
110+
111+
if(
112+
condition.is_true() &&
113+
(result.get_n_cases() == 0 || result.is_exclusive()))
114+
{
115+
return value;
116+
}
117+
118+
result.add_case(condition, value);
119+
}
120+
121+
return std::move(result);
122+
}
92123
else if(id==ID_typecast)
93124
{
94125
typecast_exprt tmp=to_typecast_expr(src_original);

src/goto-symex/goto_symex_state.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,16 @@ void goto_symex_statet::rename_address(exprt &expr, const namespacet &ns)
579579

580580
if_expr.type()=if_expr.true_case().type();
581581
}
582+
else if(expr.id() == ID_cond)
583+
{
584+
cond_exprt &cond_expr = to_cond_expr(expr);
585+
for(std::size_t i = 0; i < cond_expr.get_n_cases(); ++i)
586+
{
587+
cond_expr.condition(i) =
588+
rename<level>(std::move(cond_expr.condition(i)), ns).get();
589+
rename_address<level>(cond_expr.value(i), ns);
590+
}
591+
}
582592
else if(expr.id()==ID_member)
583593
{
584594
member_exprt &member_expr=to_member_expr(expr);

src/goto-symex/symex_dereference.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,18 @@ exprt goto_symext::address_arithmetic(
123123

124124
result=if_expr;
125125
}
126+
else if(expr.id() == ID_cond)
127+
{
128+
cond_exprt cond_expr = to_cond_expr(expr);
129+
for(std::size_t i = 0; i < cond_expr.get_n_cases(); ++i)
130+
{
131+
dereference_rec(cond_expr.condition(i), state, false);
132+
cond_expr.value(i) =
133+
address_arithmetic(cond_expr.value(i), state, keep_array);
134+
}
135+
136+
result = std::move(cond_expr);
137+
}
126138
else if(expr.id()==ID_symbol ||
127139
expr.id()==ID_string_constant ||
128140
expr.id()==ID_label ||

src/goto-symex/symex_other.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,21 @@ void goto_symext::havoc_rec(
5555
guard_f.add(not_exprt(if_expr.cond()));
5656
havoc_rec(state, guard_f, if_expr.false_case());
5757
}
58+
else if(dest.id() == ID_cond)
59+
{
60+
const auto &cond_expr = to_cond_expr(dest);
61+
for(std::size_t i = 0; i < cond_expr.get_n_cases(); ++i)
62+
{
63+
guardt guard = state.guard;
64+
if(!cond_expr.is_exclusive())
65+
{
66+
for(std::size_t j = 0; j < i; ++j)
67+
guard.add(not_exprt(cond_expr.condition(j)));
68+
}
69+
guard.add(cond_expr.condition(i));
70+
havoc_rec(state, guard, cond_expr.value(i));
71+
}
72+
}
5873
else if(dest.id()==ID_typecast)
5974
{
6075
havoc_rec(state, guard, to_typecast_expr(dest).op());

src/pointer-analysis/value_set.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,6 +1175,12 @@ void value_sett::get_reference_set_rec(
11751175
get_reference_set_rec(expr.op2(), dest, ns);
11761176
return;
11771177
}
1178+
else if(expr.id() == ID_cond)
1179+
{
1180+
const auto &cond_expr = to_cond_expr(expr);
1181+
for(std::size_t i = 0; i < cond_expr.get_n_cases(); ++i)
1182+
get_reference_set_rec(cond_expr.value(i), dest, ns);
1183+
}
11781184

11791185
insert(dest, exprt(ID_unknown, expr.type()));
11801186
}

src/pointer-analysis/value_set_dereference.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,21 @@ exprt value_set_dereferencet::dereference(const exprt &pointer)
3636
throw "dereference expected pointer type, but got "+
3737
pointer.type().pretty();
3838

39-
// we may get ifs due to recursive calls
39+
// we may get ifs or conds due to recursive calls
4040
if(pointer.id()==ID_if)
4141
{
4242
const if_exprt &if_expr=to_if_expr(pointer);
4343
exprt true_case = dereference(if_expr.true_case());
4444
exprt false_case = dereference(if_expr.false_case());
4545
return if_exprt(if_expr.cond(), true_case, false_case);
4646
}
47+
else if(pointer.id() == ID_cond)
48+
{
49+
cond_exprt result = to_cond_expr(pointer);
50+
for(std::size_t i = 0; i < result.get_n_cases(); ++i)
51+
result.value(i) = dereference(result.value(i));
52+
return std::move(result);
53+
}
4754

4855
// type of the object
4956
const typet &type=pointer.type().subtype();

0 commit comments

Comments
 (0)