Skip to content

Commit 45f7f56

Browse files
committed
full_array_abstract_objectt::to_predicate
1 parent 3bd1c87 commit 45f7f56

File tree

7 files changed

+101
-4
lines changed

7 files changed

+101
-4
lines changed

src/analyses/variable-sensitivity/full_array_abstract_object.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include <analyses/variable-sensitivity/abstract_environment.h>
1212
#include <util/arith_tools.h>
13+
#include <util/mathematical_types.h>
1314
#include <util/std_expr.h>
1415

1516
#include "abstract_value_object.h"
@@ -401,6 +402,28 @@ abstract_object_pointert full_array_abstract_objectt::visit_sub_elements(
401402
}
402403
}
403404

405+
exprt full_array_abstract_objectt::to_predicate_internal(
406+
const exprt &name) const
407+
{
408+
auto all_predicates = exprt::operandst{};
409+
410+
for(auto field : map.get_sorted_view())
411+
{
412+
auto ii = from_integer(field.first.to_long(), integer_typet());
413+
auto index = index_exprt(name, ii);
414+
auto field_expr = field.second->to_predicate(index);
415+
416+
if(!field_expr.is_true())
417+
all_predicates.push_back(field_expr);
418+
}
419+
420+
if(all_predicates.size() == 0)
421+
return true_exprt();
422+
if(all_predicates.size() == 1)
423+
return all_predicates[0];
424+
return and_exprt(all_predicates);
425+
}
426+
404427
void full_array_abstract_objectt::statistics(
405428
abstract_object_statisticst &statistics,
406429
abstract_object_visitedt &visited,

src/analyses/variable-sensitivity/full_array_abstract_object.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ class full_array_abstract_objectt : public abstract_aggregate_objectt<
212212
abstract_object_pointert full_array_merge(
213213
const full_array_pointert &other,
214214
const widen_modet &widen_mode) const;
215+
216+
exprt to_predicate_internal(const exprt &name) const override;
215217
};
216218

217219
#endif // CPROVER_ANALYSES_VARIABLE_SENSITIVITY_FULL_ARRAY_ABSTRACT_OBJECT_H

unit/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ SRC += analyses/ai/ai.cpp \
2020
analyses/variable-sensitivity/constant_abstract_value/meet.cpp \
2121
analyses/variable-sensitivity/constant_abstract_value/merge.cpp \
2222
analyses/variable-sensitivity/constant_abstract_value/to_predicate.cpp \
23+
analyses/variable-sensitivity/full_array_abstract_object/array_builder.cpp \
2324
analyses/variable-sensitivity/full_array_abstract_object/merge.cpp \
2425
analyses/variable-sensitivity/eval.cpp \
2526
analyses/variable-sensitivity/eval-member-access.cpp \
@@ -28,7 +29,6 @@ SRC += analyses/ai/ai.cpp \
2829
analyses/variable-sensitivity/interval_abstract_value/merge.cpp \
2930
analyses/variable-sensitivity/interval_abstract_value/to_predicate.cpp \
3031
analyses/variable-sensitivity/interval_abstract_value/widening_merge.cpp \
31-
analyses/variable-sensitivity/full_struct_abstract_object/array_builder.cpp \
3232
analyses/variable-sensitivity/full_struct_abstract_object/merge.cpp \
3333
analyses/variable-sensitivity/full_struct_abstract_object/struct_builder.cpp \
3434
analyses/variable-sensitivity/full_struct_abstract_object/to_predicate.cpp \

unit/analyses/variable-sensitivity/full_array_abstract_object/array_builder.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include <analyses/variable-sensitivity/abstract_environment.h>
1010
#include <analyses/variable-sensitivity/full_array_abstract_object.h>
1111
#include <analyses/variable-sensitivity/full_array_abstract_object/array_builder.h>
12-
#include <arith_tools.h>
12+
#include <util/arith_tools.h>
1313
#include <util/mathematical_types.h>
1414

1515
full_array_abstract_objectt::full_array_pointert build_array(
@@ -32,7 +32,12 @@ full_array_abstract_objectt::full_array_pointert build_array(
3232
exprt::operandst element_ops;
3333

3434
for(auto element : array)
35-
element_ops.push_back(from_integer(element, integer_typet()));
35+
{
36+
if(element != TOP_MEMBER)
37+
element_ops.push_back(from_integer(element, integer_typet()));
38+
else
39+
element_ops.push_back(nil_exprt());
40+
}
3641

3742
auto array_expr = array_exprt(element_ops, array_type);
3843
return build_array(array_expr, environment, ns);

unit/analyses/variable-sensitivity/full_array_abstract_object/array_builder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ full_array_abstract_objectt::full_array_pointert build_array(
1515
abstract_environmentt &environment,
1616
const namespacet &ns);
1717

18+
const int TOP_MEMBER = std::numeric_limits<int>::max();
1819
full_array_abstract_objectt::full_array_pointert build_array(
1920
const std::vector<int> &array,
2021
abstract_environmentt &environment,

unit/analyses/variable-sensitivity/full_array_abstract_object/merge.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
#include <analyses/variable-sensitivity/abstract_environment.h>
1313
#include <analyses/variable-sensitivity/abstract_object.h>
14-
#include <analyses/variable-sensitivity/full_array_abstract_object.h>
1514
#include <analyses/variable-sensitivity/full_array_abstract_object/array_builder.h>
1615
#include <analyses/variable-sensitivity/variable_sensitivity_object_factory.h>
1716
#include <analyses/variable-sensitivity/variable_sensitivity_test_helpers.h>
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*******************************************************************\
2+
3+
Module: Tests for full_array_abstract_objectt::to_predicate
4+
5+
Author: Jez Higgins
6+
7+
\*******************************************************************/
8+
9+
#include <analyses/variable-sensitivity/abstract_environment.h>
10+
#include <analyses/variable-sensitivity/variable_sensitivity_object_factory.h>
11+
12+
#include <analyses/variable-sensitivity/full_array_abstract_object/array_builder.h>
13+
#include <analyses/variable-sensitivity/variable_sensitivity_test_helpers.h>
14+
#include <testing-utils/use_catch.h>
15+
16+
SCENARIO(
17+
"array to predicate",
18+
"[core][analyses][variable-sensitivity][full_array_abstract_object][to_"
19+
"predicate]")
20+
{
21+
auto object_factory = variable_sensitivity_object_factoryt::configured_with(
22+
vsd_configt::constant_domain());
23+
abstract_environmentt environment(object_factory);
24+
environment.make_top();
25+
symbol_tablet symbol_table;
26+
namespacet ns(symbol_table);
27+
28+
GIVEN("full_array_abstract_object to predicate")
29+
{
30+
WHEN("it is TOP")
31+
{
32+
auto obj = build_top_array();
33+
THEN_PREDICATE(obj, "TRUE");
34+
}
35+
WHEN("it is BOTTOM")
36+
{
37+
auto obj = build_bottom_array();
38+
THEN_PREDICATE(obj, "FALSE");
39+
}
40+
WHEN("[ 1 ]")
41+
{
42+
auto obj = build_array({1}, environment, ns);
43+
THEN_PREDICATE(obj, "x[0] == 1");
44+
}
45+
WHEN("[ 1, 2, 3 ]")
46+
{
47+
auto obj = build_array({1, 2, 3}, environment, ns);
48+
THEN_PREDICATE(obj, "x[0] == 1 && x[1] == 2 && x[2] == 3");
49+
}
50+
WHEN("[ 1, 2, TOP ]")
51+
{
52+
auto obj = build_array({1, 2, TOP_MEMBER}, environment, ns);
53+
THEN_PREDICATE(obj, "x[0] == 1 && x[1] == 2");
54+
}
55+
WHEN("[ TOP, 2, TOP ]")
56+
{
57+
auto obj = build_array({TOP_MEMBER, 2, TOP_MEMBER}, environment, ns);
58+
THEN_PREDICATE(obj, "x[1] == 2");
59+
}
60+
WHEN("[ TOP, TOP, TOP ]")
61+
{
62+
auto obj =
63+
build_array({TOP_MEMBER, TOP_MEMBER, TOP_MEMBER}, environment, ns);
64+
THEN_PREDICATE(obj, "TRUE");
65+
}
66+
}
67+
}

0 commit comments

Comments
 (0)