Skip to content

Commit 8f56a5b

Browse files
Unit test for try_evaluate_pointer_comparisions
1 parent dcc9d79 commit 8f56a5b

File tree

2 files changed

+127
-0
lines changed

2 files changed

+127
-0
lines changed

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ SRC += analyses/ai/ai.cpp \
3535
goto-symex/is_constant.cpp \
3636
goto-symex/symex_level0.cpp \
3737
goto-symex/symex_level1.cpp \
38+
goto-symex/try_evaluate_pointer_comparisons.cpp \
3839
interpreter/interpreter.cpp \
3940
json/json_parser.cpp \
4041
json_symbol_table.cpp \
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
/*******************************************************************\
2+
3+
Module: Unit tests for try_evaluate_pointer_comparisons
4+
5+
Author: Romain Brenguier, [email protected]
6+
7+
\*******************************************************************/
8+
9+
#include <testing-utils/message.h>
10+
#include <testing-utils/use_catch.h>
11+
12+
#include <goto-symex/goto_symex.h>
13+
#include <util/c_types.h>
14+
15+
static void add_to_symbol_table(
16+
symbol_tablet &symbol_table, const symbol_exprt &symbol_expr)
17+
{
18+
symbolt symbol;
19+
symbol.name = symbol_expr.get_identifier();
20+
symbol.type = symbol_expr.type();
21+
symbol.value = symbol_expr;
22+
symbol.is_thread_local = true;
23+
symbol_table.insert(symbol);
24+
}
25+
26+
SCENARIO("Try to evaluate pointer comparisons",
27+
"[core][goto-symex][try_evaluate_pointer_comparisons]")
28+
{
29+
const unsignedbv_typet int_type{32};
30+
const pointer_typet ptr_type = pointer_type(int_type);
31+
const symbol_exprt ptr1{"ptr1", ptr_type};
32+
const symbol_exprt ptr2{"ptr2", ptr_type};
33+
const symbol_exprt value1{"value1", int_type};
34+
const address_of_exprt address1{value1};
35+
const symbol_exprt value2{"value2", int_type};
36+
const address_of_exprt address2{value2};
37+
const symbol_exprt b{"b", bool_typet{}};
38+
39+
// Add symbols to symbol table
40+
symbol_tablet symbol_table;
41+
namespacet ns{symbol_table};
42+
add_to_symbol_table(symbol_table, ptr1);
43+
add_to_symbol_table(symbol_table, ptr2);
44+
add_to_symbol_table(symbol_table, value1);
45+
add_to_symbol_table(symbol_table, value2);
46+
add_to_symbol_table(symbol_table, b);
47+
48+
// Initialize goto state
49+
std::list<goto_programt::instructiont> target;
50+
symex_targett::sourcet source{"fun", target.begin()};
51+
guard_managert guard_manager;
52+
std::size_t count = 0;
53+
auto fresh_name = [&count](const irep_idt &){ return count++; };
54+
goto_symex_statet state{source, guard_manager, fresh_name};
55+
56+
GIVEN("A value set in which pointer symbol `ptr1` only points to `&value1`")
57+
{
58+
value_sett value_set;
59+
const renamedt<exprt, L1> ptr1_l1 = state.rename<L1>(ptr1, ns);
60+
const renamedt<exprt, L1> address1_l1 = state.rename<L1>(address1, ns);
61+
// ptr1 <- &value1
62+
value_set.assign(ptr1_l1.get(), address1_l1.get(), ns, false, false);
63+
64+
WHEN("Evaluating ptr1 == &value1")
65+
{
66+
const equal_exprt comparison{ptr1, address1};
67+
const renamedt<exprt, L2> renamed_comparison =
68+
state.rename(comparison, ns);
69+
auto result = try_evaluate_pointer_comparisons(
70+
renamed_comparison, value_set, ID_java, ns);
71+
THEN("Evaluation succeeds")
72+
{
73+
REQUIRE(result.get() == true_exprt{});
74+
}
75+
}
76+
77+
WHEN("Evaluating ptr1 != &value1")
78+
{
79+
const notequal_exprt comparison{ptr1, address1};
80+
const renamedt<exprt, L2> renamed_comparison =
81+
state.rename(comparison, ns);
82+
auto result = try_evaluate_pointer_comparisons(
83+
renamed_comparison, value_set, ID_java, ns);
84+
THEN("Evaluation succeeds")
85+
{
86+
REQUIRE(result.get() == false_exprt{});
87+
}
88+
}
89+
90+
WHEN("Evaluating ptr1 == ptr2")
91+
{
92+
const equal_exprt comparison{ptr1, ptr2};
93+
const renamedt<exprt, L2> renamed_comparison = state.rename(comparison, ns);
94+
auto result = try_evaluate_pointer_comparisons(
95+
renamed_comparison, value_set, ID_java, ns);
96+
THEN("Evaluation leaves the expression unchanged")
97+
{
98+
REQUIRE(result.get() == renamed_comparison.get());
99+
}
100+
}
101+
}
102+
103+
GIVEN("A value set in which pointer symbol `ptr1` can point to `&value1` or "
104+
"`&value2`")
105+
{
106+
value_sett value_set;
107+
const if_exprt if_expr{b, address1, address2};
108+
const renamedt<exprt, L1> ptr1_l1 = state.rename<L1>(ptr1, ns);
109+
const renamedt<exprt, L1> if_expr_l1 = state.rename<L1>(if_expr, ns);
110+
// ptr1 <- b ? &value1 : &value2
111+
value_set.assign(ptr1_l1.get(), if_expr_l1.get(), ns, false, false);
112+
113+
WHEN("Evaluating ptr1 == &value1")
114+
{
115+
const equal_exprt comparison{ptr1, address1};
116+
const renamedt<exprt, L2> renamed_comparison =
117+
state.rename(comparison, ns);
118+
auto result = try_evaluate_pointer_comparisons(
119+
renamed_comparison, value_set, ID_java, ns);
120+
THEN("Evaluation leaves the expression unchanged")
121+
{
122+
REQUIRE(result.get() == renamed_comparison.get());
123+
}
124+
}
125+
}
126+
}

0 commit comments

Comments
 (0)