Skip to content

Commit 6e5969c

Browse files
author
Enrico Steffinlongo
committed
Add invalid pointer object to smt_object_map and fix tests
1 parent 6766bc4 commit 6e5969c

File tree

5 files changed

+70
-24
lines changed

5 files changed

+70
-24
lines changed

src/solvers/smt2_incremental/object_tracking.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
#include <util/std_expr.h>
1010
#include <util/string_constant.h>
1111

12+
exprt make_invalid_pointer_expr()
13+
{
14+
return constant_exprt(ID_invalid, pointer_type(void_type()));
15+
}
16+
1217
exprt find_object_base_expression(const address_of_exprt &address_of)
1318
{
1419
auto current = std::ref(address_of.object());
@@ -47,12 +52,28 @@ static decision_procedure_objectt make_null_object()
4752
return null_object;
4853
}
4954

55+
static decision_procedure_objectt make_invalid_pointer_object()
56+
{
57+
decision_procedure_objectt invalid_pointer_object;
58+
// Using unique_id = 1, so 0 is the NULL object, 1 is the invalid object and
59+
// other valid objects have unique_id > 1.
60+
invalid_pointer_object.unique_id = 1;
61+
invalid_pointer_object.base_expression = make_invalid_pointer_expr();
62+
invalid_pointer_object.size = from_integer(0, size_type());
63+
return invalid_pointer_object;
64+
}
65+
5066
smt_object_mapt initial_smt_object_map()
5167
{
5268
smt_object_mapt object_map;
5369
decision_procedure_objectt null_object = make_null_object();
54-
exprt base = null_object.base_expression;
55-
object_map.emplace(std::move(base), std::move(null_object));
70+
exprt null_object_base = null_object.base_expression;
71+
object_map.emplace(std::move(null_object_base), std::move(null_object));
72+
decision_procedure_objectt invalid_pointer_object =
73+
make_invalid_pointer_object();
74+
exprt invalid_pointer_object_base = invalid_pointer_object.base_expression;
75+
object_map.emplace(
76+
std::move(invalid_pointer_object_base), std::move(invalid_pointer_object));
5677
return object_map;
5778
}
5879

src/solvers/smt2_incremental/object_tracking.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,7 @@ bool objects_are_already_tracked(
115115
const exprt &expression,
116116
const smt_object_mapt &object_map);
117117

118+
/// \brief Create the invalid pointer constant
119+
exprt make_invalid_pointer_expr();
120+
118121
#endif // CPROVER_SOLVERS_SMT2_INCREMENTAL_OBJECT_TRACKING_H

unit/solvers/smt2_incremental/convert_expr_to_smt.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1358,20 +1358,20 @@ TEST_CASE(
13581358
{
13591359
config.bv_encoding.object_bits = 8;
13601360
const auto converted = test.convert(address_of_foo);
1361-
CHECK(test.object_map.at(foo).unique_id == 1);
1361+
CHECK(test.object_map.at(foo).unique_id == 2);
13621362
CHECK(
13631363
converted == smt_bit_vector_theoryt::concat(
1364-
smt_bit_vector_constant_termt{1, 8},
1364+
smt_bit_vector_constant_termt{2, 8},
13651365
smt_bit_vector_constant_termt{0, 56}));
13661366
}
13671367
SECTION("16 object bits")
13681368
{
13691369
config.bv_encoding.object_bits = 16;
13701370
const auto converted = test.convert(address_of_foo);
1371-
CHECK(test.object_map.at(foo).unique_id == 1);
1371+
CHECK(test.object_map.at(foo).unique_id == 2);
13721372
CHECK(
13731373
converted == smt_bit_vector_theoryt::concat(
1374-
smt_bit_vector_constant_termt{1, 16},
1374+
smt_bit_vector_constant_termt{2, 16},
13751375
smt_bit_vector_constant_termt{0, 48}));
13761376
}
13771377
}
@@ -1429,15 +1429,15 @@ TEST_CASE(
14291429
track_expression_objects(comparison, ns, test.object_map);
14301430
INFO("Expression " + comparison.pretty(1, 0));
14311431
const auto converted = test.convert(comparison);
1432-
CHECK(test.object_map.at(foo).unique_id == 2);
1433-
CHECK(test.object_map.at(bar).unique_id == 1);
1432+
CHECK(test.object_map.at(foo).unique_id == 3);
1433+
CHECK(test.object_map.at(bar).unique_id == 2);
14341434
CHECK(
14351435
converted == smt_core_theoryt::distinct(
14361436
smt_bit_vector_theoryt::concat(
1437-
smt_bit_vector_constant_termt{2, 8},
1437+
smt_bit_vector_constant_termt{3, 8},
14381438
smt_bit_vector_constant_termt{0, 56}),
14391439
smt_bit_vector_theoryt::concat(
1440-
smt_bit_vector_constant_termt{1, 8},
1440+
smt_bit_vector_constant_termt{2, 8},
14411441
smt_bit_vector_constant_termt{0, 56})));
14421442
}
14431443
}
@@ -1543,7 +1543,7 @@ TEST_CASE(
15431543
const object_size_exprt object_size{
15441544
address_of_exprt{foo}, unsignedbv_typet{64}};
15451545
track_expression_objects(object_size, ns, test.object_map);
1546-
const auto foo_id = 1;
1546+
const auto foo_id = 2;
15471547
CHECK(test.object_map.at(foo).unique_id == foo_id);
15481548
const auto object_bits = config.bv_encoding.object_bits;
15491549
const auto object = smt_bit_vector_constant_termt{foo_id, object_bits};

unit/solvers/smt2_incremental/object_tracking.cpp

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,20 @@ TEST_CASE("Tracking object base expressions", "[core][smt2_incremental]")
118118
smt_object_mapt object_map = initial_smt_object_map();
119119
SECTION("Check initial object map has null pointer")
120120
{
121-
REQUIRE(object_map.size() == 1);
121+
REQUIRE(object_map.size() == 2);
122122
const exprt null_pointer = null_pointer_exprt{::pointer_type(void_type())};
123-
CHECK(object_map.begin()->first == null_pointer);
124-
CHECK(object_map.begin()->second.unique_id == 0);
125-
CHECK(object_map.begin()->second.base_expression == null_pointer);
123+
const auto actual_null_object = object_map.find(null_pointer);
124+
CHECK(actual_null_object->first == null_pointer);
125+
CHECK(actual_null_object->second.unique_id == 0);
126+
CHECK(actual_null_object->second.base_expression == null_pointer);
127+
const exprt invalid_object_pointer = make_invalid_pointer_expr();
128+
const auto actual_invalid_object_pointer =
129+
object_map.find(invalid_object_pointer);
130+
CHECK(actual_invalid_object_pointer->first == invalid_object_pointer);
131+
CHECK(actual_invalid_object_pointer->second.unique_id == 1);
132+
CHECK(
133+
actual_invalid_object_pointer->second.base_expression ==
134+
invalid_object_pointer);
126135
}
127136
symbol_tablet symbol_table;
128137
namespacet ns{symbol_table};
@@ -133,15 +142,15 @@ TEST_CASE("Tracking object base expressions", "[core][smt2_incremental]")
133142
track_expression_objects(compound_expression, ns, object_map);
134143
SECTION("Tracking expression objects")
135144
{
136-
CHECK(object_map.size() == 4);
145+
CHECK(object_map.size() == 5);
137146
const auto foo_object = object_map.find(foo);
138147
REQUIRE(foo_object != object_map.end());
139148
CHECK(foo_object->second.base_expression == foo);
140-
CHECK(foo_object->second.unique_id == 3);
149+
CHECK(foo_object->second.unique_id == 4);
141150
const auto bar_object = object_map.find(bar);
142151
REQUIRE(bar_object != object_map.end());
143152
CHECK(bar_object->second.base_expression == bar);
144-
CHECK(bar_object->second.unique_id == 1);
153+
CHECK(bar_object->second.unique_id == 2);
145154
}
146155
SECTION("Confirming objects are tracked.")
147156
{

unit/solvers/smt2_incremental/smt2_incremental_decision_procedure.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,9 @@ TEST_CASE(
414414
const auto null_object_size_definition =
415415
test.object_size_function.make_definition(
416416
0, smt_bit_vector_constant_termt{0, 32});
417+
const auto invalid_pointer_object_size_definition =
418+
test.object_size_function.make_definition(
419+
1, smt_bit_vector_constant_termt{0, 32});
417420
const symbolt foo = make_test_symbol("foo", signedbv_typet{16});
418421
const smt_identifier_termt foo_term{"foo", smt_bit_vector_sortt{16}};
419422
const exprt expr_42 = from_integer({42}, signedbv_typet{16});
@@ -425,13 +428,23 @@ TEST_CASE(
425428
test.procedure.set_to(equal_42, true);
426429
test.mock_responses.push_back(smt_check_sat_responset{smt_sat_responset{}});
427430
test.procedure();
431+
std::vector<smt_commandt> expected_commands{
432+
smt_declare_function_commandt{foo_term, {}},
433+
smt_assert_commandt{smt_core_theoryt::equal(foo_term, term_42)},
434+
invalid_pointer_object_size_definition,
435+
null_object_size_definition,
436+
smt_check_sat_commandt{}};
428437
REQUIRE(
429-
test.sent_commands ==
430-
std::vector<smt_commandt>{
431-
smt_declare_function_commandt{foo_term, {}},
432-
smt_assert_commandt{smt_core_theoryt::equal(foo_term, term_42)},
433-
null_object_size_definition,
434-
smt_check_sat_commandt{}});
438+
(test.sent_commands.size() == expected_commands.size() &&
439+
std::all_of(
440+
expected_commands.begin(),
441+
expected_commands.end(),
442+
[&](const smt_commandt &command) -> bool {
443+
return std::find(
444+
test.sent_commands.begin(),
445+
test.sent_commands.end(),
446+
command) != test.sent_commands.end();
447+
})));
435448
SECTION("Get \"foo\" value back")
436449
{
437450
test.sent_commands.clear();

0 commit comments

Comments
 (0)