Skip to content

Commit 90cd613

Browse files
committed
initial tests for value_Set_abstract_object widening merge
1 parent 3279714 commit 90cd613

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-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 \

unit/analyses/variable-sensitivity/interval_abstract_value/widening_merge.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <analyses/variable-sensitivity/variable_sensitivity_test_helpers.h>
1111
#include <testing-utils/use_catch.h>
1212

13+
#include <util/arith_tools.h>
1314
#include <util/bitvector_types.h>
1415

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

0 commit comments

Comments
 (0)