Skip to content

Commit c57e6c2

Browse files
committed
full_struct_abstract_objectt::to_predicate
1 parent 8998e64 commit c57e6c2

File tree

6 files changed

+105
-3
lines changed

6 files changed

+105
-3
lines changed

src/analyses/variable-sensitivity/full_struct_abstract_object.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,27 @@ abstract_object_pointert full_struct_abstract_objectt::visit_sub_elements(
307307
}
308308
}
309309

310+
exprt full_struct_abstract_objectt::to_predicate_internal(
311+
const exprt &name) const
312+
{
313+
auto all_predicates = exprt::operandst{};
314+
315+
for(auto field : map.get_sorted_view())
316+
{
317+
auto field_name = member_exprt(name, field.first, name.type());
318+
auto field_expr = field.second->to_predicate(field_name);
319+
320+
if(!field_expr.is_true())
321+
all_predicates.push_back(field_expr);
322+
}
323+
324+
if(all_predicates.size() == 0)
325+
return true_exprt();
326+
if(all_predicates.size() == 1)
327+
return all_predicates[0];
328+
return and_exprt(all_predicates);
329+
}
330+
310331
void full_struct_abstract_objectt::statistics(
311332
abstract_object_statisticst &statistics,
312333
abstract_object_visitedt &visited,

src/analyses/variable-sensitivity/full_struct_abstract_object.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ class full_struct_abstract_objectt : public abstract_aggregate_objectt<
169169
abstract_object_pointert merge(
170170
const abstract_object_pointert &other,
171171
const widen_modet &widen_mode) const override;
172+
173+
exprt to_predicate_internal(const exprt &name) const override;
172174
};
173175

174176
#endif // CPROVER_ANALYSES_VARIABLE_SENSITIVITY_FULL_STRUCT_ABSTRACT_OBJECT_H

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ SRC += analyses/ai/ai.cpp \
3030
analyses/variable-sensitivity/interval_abstract_value/widening_merge.cpp \
3131
analyses/variable-sensitivity/full_struct_abstract_object/merge.cpp \
3232
analyses/variable-sensitivity/full_struct_abstract_object/struct_builder.cpp \
33+
analyses/variable-sensitivity/full_struct_abstract_object/to_predicate.cpp \
3334
analyses/variable-sensitivity/last_written_location.cpp \
3435
analyses/variable-sensitivity/value_expression_evaluation/assume.cpp \
3536
analyses/variable-sensitivity/value_expression_evaluation/assume_prune.cpp \

unit/analyses/variable-sensitivity/full_struct_abstract_object/struct_builder.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@ full_struct_abstract_objectt::constant_struct_pointert build_struct(
5353
struct_union_typet::componentt(member.first, integer_typet());
5454
struct_type.components().push_back(component);
5555

56-
auto value = from_integer(member.second, integer_typet());
57-
val1_op.push_back(value);
56+
if(member.second != TOP_MEMBER)
57+
val1_op.push_back(from_integer(member.second, integer_typet()));
58+
else
59+
val1_op.push_back(nil_exprt());
5860
}
5961

6062
auto val1 = struct_exprt(val1_op, struct_type);

unit/analyses/variable-sensitivity/full_struct_abstract_object/struct_builder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#ifndef CPROVER_ANALYSES_VARIABLE_SENSITIVITY_FULL_STRUCT_ABSTRACT_OBJECT_STRUCT_BUILDER_H
99
#define CPROVER_ANALYSES_VARIABLE_SENSITIVITY_FULL_STRUCT_ABSTRACT_OBJECT_STRUCT_BUILDER_H
1010

11-
#include <variable-sensitivity/full_struct_abstract_object.h>
11+
#include <analyses/variable-sensitivity/full_struct_abstract_object.h>
1212

1313
#include <map>
1414

@@ -20,6 +20,7 @@ full_struct_abstract_objectt::constant_struct_pointert build_struct(
2020
abstract_environmentt &environment,
2121
const namespacet &ns);
2222

23+
const int TOP_MEMBER = std::numeric_limits<int>::max();
2324
full_struct_abstract_objectt::constant_struct_pointert build_struct(
2425
const std::map<std::string, int> &members,
2526
abstract_environmentt &environment,
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*******************************************************************\
2+
3+
Module: Tests for full_struct_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/full_struct_abstract_object.h>
11+
#include <analyses/variable-sensitivity/variable_sensitivity_object_factory.h>
12+
13+
#include <analyses/variable-sensitivity/full_struct_abstract_object/struct_builder.h>
14+
#include <analyses/variable-sensitivity/variable_sensitivity_test_helpers.h>
15+
#include <testing-utils/use_catch.h>
16+
17+
#include <util/arith_tools.h>
18+
#include <util/mathematical_types.h>
19+
20+
SCENARIO(
21+
"struct to predicate",
22+
"[core][analyses][variable-sensitivity][full_struct_abstract_object][to_"
23+
"predicate]")
24+
{
25+
auto object_factory = variable_sensitivity_object_factoryt::configured_with(
26+
vsd_configt::constant_domain());
27+
abstract_environmentt environment(object_factory);
28+
environment.make_top();
29+
symbol_tablet symbol_table;
30+
namespacet ns(symbol_table);
31+
32+
GIVEN("full_struct_abstract_object to predicate")
33+
{
34+
WHEN("it is TOP")
35+
{
36+
auto obj = build_top_struct();
37+
THEN_PREDICATE(obj, "TRUE");
38+
}
39+
WHEN("it is BOTTOM")
40+
{
41+
auto obj = build_bottom_struct();
42+
THEN_PREDICATE(obj, "FALSE");
43+
}
44+
WHEN("{ .a = 1 }")
45+
{
46+
auto obj = build_struct({{"a", 1}}, environment, ns);
47+
THEN_PREDICATE(obj, "x.a == 1");
48+
}
49+
WHEN("{ .a = 1, .b = 2, .c = 3 }")
50+
{
51+
auto obj = build_struct({{"a", 1}, {"b", 2}, {"c", 3}}, environment, ns);
52+
THEN_PREDICATE(obj, "x.a == 1 && x.b == 2 && x.c == 3");
53+
}
54+
WHEN("{ .a = 1, .b = 2, .c = TOP }")
55+
{
56+
auto obj =
57+
build_struct({{"a", 1}, {"b", 2}, {"c", TOP_MEMBER}}, environment, ns);
58+
THEN_PREDICATE(obj, "x.a == 1 && x.b == 2");
59+
}
60+
WHEN("{ .a = TOP, .b = 2, .c = TOP }")
61+
{
62+
auto obj = build_struct(
63+
{{"a", TOP_MEMBER}, {"b", 2}, {"c", TOP_MEMBER}}, environment, ns);
64+
THEN_PREDICATE(obj, "x.b == 2");
65+
}
66+
WHEN("{ .a = TOP, .b = TOP, .c = TOP }")
67+
{
68+
auto obj = build_struct(
69+
{{"a", TOP_MEMBER}, {"b", TOP_MEMBER}, {"c", TOP_MEMBER}},
70+
environment,
71+
ns);
72+
THEN_PREDICATE(obj, "TRUE");
73+
}
74+
}
75+
}

0 commit comments

Comments
 (0)