Skip to content

Commit ded9716

Browse files
Test try_evaluate_pointer_comparisons unknown case
This adds a unit test for the case where the value set contains unknown. In that case no comparison can be decided.
1 parent 0cbcdb1 commit ded9716

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

unit/goto-symex/try_evaluate_pointer_comparisons.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,58 @@ SCENARIO(
157157
}
158158
}
159159

160+
GIVEN(
161+
"A value set in which pointer symbol `ptr1` can point to `&value1` or "
162+
"`unknown`")
163+
{
164+
symex_value_sett value_set;
165+
const exprt unknown_expr{ID_unknown, ptr_type};
166+
const if_exprt if_expr{b, address1, unknown_expr};
167+
const renamedt<ssa_exprt, L1> ptr1_l1 = state.rename_ssa<L1>(ssa_ptr1, ns);
168+
const renamedt<exprt, L1> if_expr_l1 = state.rename<L1>(if_expr, ns);
169+
// ptr1 <- b ? &value1 : unknown
170+
value_set.assign(ptr1_l1, if_expr_l1, ns, false, false);
171+
172+
WHEN("Evaluating ptr1 == &value1")
173+
{
174+
const equal_exprt comparison{ptr1, address1};
175+
const renamedt<exprt, L2> renamed_comparison =
176+
state.rename(comparison, ns);
177+
auto result = try_evaluate_pointer_comparisons(
178+
renamed_comparison, value_set, ID_java, ns);
179+
THEN("Evaluation leaves the expression unchanged")
180+
{
181+
REQUIRE(result.get() == renamed_comparison.get());
182+
}
183+
}
184+
185+
WHEN("Evaluating ptr1 != &value1")
186+
{
187+
const notequal_exprt comparison{ptr1, address1};
188+
const renamedt<exprt, L2> renamed_comparison =
189+
state.rename(comparison, ns);
190+
auto result = try_evaluate_pointer_comparisons(
191+
renamed_comparison, value_set, ID_java, ns);
192+
THEN("Evaluation leaves the expression unchanged")
193+
{
194+
REQUIRE(result.get() == renamed_comparison.get());
195+
}
196+
}
197+
198+
WHEN("Evaluating ptr1 != nullptr")
199+
{
200+
const notequal_exprt comparison{ptr1, null_ptr};
201+
const renamedt<exprt, L2> renamed_comparison =
202+
state.rename(comparison, ns);
203+
auto result = try_evaluate_pointer_comparisons(
204+
renamed_comparison, value_set, ID_java, ns);
205+
THEN("Evaluation leaves the expression unchanged")
206+
{
207+
REQUIRE(result.get() == renamed_comparison.get());
208+
}
209+
}
210+
}
211+
160212
GIVEN("A struct whose first element can only point to `&value1`")
161213
{
162214
// member is `struct_symbol.pointer_field`

0 commit comments

Comments
 (0)