|
| 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