Skip to content

Commit 63ae284

Browse files
committed
initial tests for value_Set_abstract_object widening merge
1 parent 2ec1f1c commit 63ae284

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ SRC += analyses/ai/ai.cpp \
3131
analyses/variable-sensitivity/value_set_abstract_object/compacting.cpp \
3232
analyses/variable-sensitivity/value_set_abstract_object/meet.cpp \
3333
analyses/variable-sensitivity/value_set_abstract_object/merge.cpp \
34+
analyses/variable-sensitivity/value_set_abstract_object/widening_merge.cpp \
3435
analyses/variable-sensitivity/variable_sensitivity_test_helpers.cpp \
3536
ansi-c/max_malloc_size.cpp \
3637
ansi-c/type2name.cpp \
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*******************************************************************\
2+
3+
Module: Unit tests for value_set_abstract_objectt::merge
4+
5+
Author: Jez Higgins.
6+
7+
\*******************************************************************/
8+
9+
#include <analyses/variable-sensitivity/variable_sensitivity_object_factory.h>
10+
#include <analyses/variable-sensitivity/variable_sensitivity_test_helpers.h>
11+
#include <testing-utils/use_catch.h>
12+
13+
#include <util/bitvector_types.h>
14+
15+
static merge_result<const value_set_abstract_objectt>
16+
widening_merge(abstract_object_pointert op1, abstract_object_pointert op2)
17+
{
18+
auto result = abstract_objectt::merge(op1, op2, widen_modet::could_widen);
19+
20+
return {result.modified, as_value_set(result.object)};
21+
}
22+
23+
SCENARIO(
24+
"widening merge value_set_abstract_object",
25+
"[core][analyses][variable-sensitivity][value_set_abstract_object][merge]")
26+
{
27+
auto type = signedbv_typet(32);
28+
auto val0 = from_integer(0, type);
29+
auto val1 = from_integer(1, type);
30+
auto val2 = from_integer(2, type);
31+
auto val3 = from_integer(3, type);
32+
auto val4 = from_integer(4, type);
33+
auto val5 = from_integer(5, type);
34+
auto val6 = from_integer(6, type);
35+
auto val7 = from_integer(7, type);
36+
auto val8 = from_integer(8, type);
37+
auto val9 = from_integer(9, type);
38+
auto val10 = from_integer(10, type);
39+
auto val11 = from_integer(11, type);
40+
auto val12 = from_integer(12, type);
41+
auto val13 = from_integer(13, type);
42+
43+
auto config = vsd_configt::constant_domain();
44+
config.context_tracking.data_dependency_context = false;
45+
config.context_tracking.last_write_context = false;
46+
auto object_factory =
47+
variable_sensitivity_object_factoryt::configured_with(config);
48+
abstract_environmentt environment{object_factory};
49+
environment.make_top();
50+
symbol_tablet symbol_table;
51+
namespacet ns(symbol_table);
52+
53+
GIVEN("value_set merges which don't widen")
54+
{
55+
WHEN("merging {1, 2} with {1, 2}")
56+
{
57+
auto op1 = make_value_set({val1, val2}, environment, ns);
58+
auto op2 = make_value_set({val1, val2}, environment, ns);
59+
60+
auto merged = widening_merge(op1, op2);
61+
62+
THEN("result is unmodified {1, 2}")
63+
{
64+
EXPECT_UNMODIFIED(merged, {val1, val2});
65+
}
66+
}
67+
WHEN("merging {1, 5} with {2, 3}")
68+
{
69+
auto op1 = make_value_set({val1, val5}, environment, ns);
70+
auto op2 = make_value_set({val2, val3}, environment, ns);
71+
72+
auto merged = widening_merge(op1, op2);
73+
74+
THEN("result is unmodified {1, 2, 3, 5}")
75+
{
76+
EXPECT_MODIFIED(merged, {val1, val2, val3, val5});
77+
}
78+
}
79+
WHEN("merging { 1, 4, 7, 10, 13 } with { 2, 3, 5, 6, 8, 9, 11, 12 }")
80+
{
81+
auto op1 =
82+
make_value_set({val1, val4, val7, val10, val13}, environment, ns);
83+
auto op2 = make_value_set(
84+
{val2, val3, val5, val6, val8, val9, val11, val12}, environment, ns);
85+
86+
auto merged = widening_merge(op1, op2);
87+
88+
THEN("result is compacted but not widened { [1, 5], 6, 7, 8, [9, 13]")
89+
{
90+
auto interval_1_5 = constant_interval_exprt(val1, val5);
91+
auto interval_9_13 = constant_interval_exprt(val9, val13);
92+
EXPECT_MODIFIED(
93+
merged, {interval_1_5, val6, val7, val8, interval_9_13});
94+
}
95+
}
96+
}
97+
}

0 commit comments

Comments
 (0)