Skip to content

Commit 4a859f3

Browse files
committed
Supply smt object size function to expr to smt conversion
Ready for converting object size expressions
1 parent 163d4fb commit 4a859f3

File tree

5 files changed

+38
-20
lines changed

5 files changed

+38
-20
lines changed

src/solvers/smt2_incremental/convert_expr_to_smt.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,7 +1291,8 @@ static smt_termt convert_expr_to_smt(
12911291
static smt_termt dispatch_expr_to_smt_conversion(
12921292
const exprt &expr,
12931293
const sub_expression_mapt &converted,
1294-
const smt_object_mapt &object_map)
1294+
const smt_object_mapt &object_map,
1295+
const smt_object_sizet::make_applicationt &object_size)
12951296
{
12961297
if(const auto symbol = expr_try_dynamic_cast<symbol_exprt>(expr))
12971298
{
@@ -1647,8 +1648,10 @@ at_scope_exitt<functiont> at_scope_exit(functiont exit_function)
16471648
}
16481649
#endif
16491650

1650-
smt_termt
1651-
convert_expr_to_smt(const exprt &expr, const smt_object_mapt &object_map)
1651+
smt_termt convert_expr_to_smt(
1652+
const exprt &expr,
1653+
const smt_object_mapt &object_map,
1654+
const smt_object_sizet::make_applicationt &object_size)
16521655
{
16531656
#ifndef CPROVER_INVARIANT_DO_NOT_CHECK
16541657
static bool in_conversion = false;
@@ -1665,8 +1668,8 @@ convert_expr_to_smt(const exprt &expr, const smt_object_mapt &object_map)
16651668
const auto find_result = sub_expression_map.find(expr);
16661669
if(find_result != sub_expression_map.cend())
16671670
return;
1668-
smt_termt term =
1669-
dispatch_expr_to_smt_conversion(expr, sub_expression_map, object_map);
1671+
smt_termt term = dispatch_expr_to_smt_conversion(
1672+
expr, sub_expression_map, object_map, object_size);
16701673
sub_expression_map.emplace_hint(find_result, expr, std::move(term));
16711674
});
16721675
return std::move(sub_expression_map.at(expr));

src/solvers/smt2_incremental/convert_expr_to_smt.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#define CPROVER_SOLVERS_SMT2_INCREMENTAL_CONVERT_EXPR_TO_SMT_H
55

66
#include <solvers/smt2_incremental/object_tracking.h>
7+
#include <solvers/smt2_incremental/smt_object_size.h>
78
#include <solvers/smt2_incremental/smt_sorts.h>
89
#include <solvers/smt2_incremental/smt_terms.h>
910

@@ -16,7 +17,9 @@ smt_sortt convert_type_to_smt_sort(const typet &type);
1617

1718
/// \brief Converts the \p expression to an smt encoding of the same expression
1819
/// stored as term ast (abstract syntax tree).
19-
smt_termt
20-
convert_expr_to_smt(const exprt &expression, const smt_object_mapt &object_map);
20+
smt_termt convert_expr_to_smt(
21+
const exprt &expression,
22+
const smt_object_mapt &object_map,
23+
const smt_object_sizet::make_applicationt &object_size);
2124

2225
#endif // CPROVER_SOLVERS_SMT2_INCREMENTAL_CONVERT_EXPR_TO_SMT_H

src/solvers/smt2_incremental/smt2_incremental_decision_procedure.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ smt_termt
163163
smt2_incremental_decision_proceduret::convert_expr_to_smt(const exprt &expr)
164164
{
165165
track_expression_objects(expr, ns, object_map);
166-
return ::convert_expr_to_smt(expr, object_map);
166+
return ::convert_expr_to_smt(
167+
expr, object_map, object_size_function.make_application);
167168
}
168169

169170
exprt smt2_incremental_decision_proceduret::handle(const exprt &expr)
@@ -206,7 +207,8 @@ exprt smt2_incremental_decision_proceduret::get(const exprt &expr) const
206207
objects_are_already_tracked(expr, object_map),
207208
"Objects in expressions being read should already be tracked from "
208209
"point of being set/handled.");
209-
descriptor = ::convert_expr_to_smt(expr, object_map);
210+
descriptor = ::convert_expr_to_smt(
211+
expr, object_map, object_size_function.make_application);
210212
}
211213
else
212214
{

src/solvers/smt2_incremental/smt_object_size.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ struct smt_object_sizet final
1717
/// The command for declaring the object size function. The defined function
1818
/// takes a bit vector encoded unique object identifier and returns
1919
smt_declare_function_commandt declaration;
20-
/// Function which makes applications of the function.
21-
smt_function_application_termt::factoryt<smt_command_functiont>
22-
make_application;
20+
/// Function which makes applications of the smt function.
21+
using make_applicationt =
22+
smt_function_application_termt::factoryt<smt_command_functiont>;
23+
make_applicationt make_application;
2324
/// Makes the command to define the resulting \p size of calling the object
2425
/// size function with \p unique_id.
2526
smt_commandt make_definition(std::size_t unique_id, smt_termt size) const;

unit/solvers/smt2_incremental/convert_expr_to_smt.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ TEST_CASE("\"typet\" to smt sort conversion", "[core][smt2_incremental]")
4545

4646
smt_termt convert_expr_to_smt(const exprt &expression)
4747
{
48-
return convert_expr_to_smt(expression, initial_smt_object_map());
48+
return convert_expr_to_smt(
49+
expression, initial_smt_object_map(), smt_object_sizet{}.make_application);
4950
}
5051

5152
TEST_CASE("\"symbol_exprt\" to smt term conversion", "[core][smt2_incremental]")
@@ -1092,6 +1093,7 @@ TEST_CASE(
10921093
config.ansi_c.set_arch_spec_x86_64();
10931094
const symbol_tablet symbol_table;
10941095
const namespacet ns{symbol_table};
1096+
const smt_object_sizet object_size;
10951097
smt_object_mapt object_map = initial_smt_object_map();
10961098
const symbol_exprt foo{"foo", unsignedbv_typet{32}};
10971099
const symbol_exprt bar{"bar", unsignedbv_typet{32}};
@@ -1103,7 +1105,8 @@ TEST_CASE(
11031105
SECTION("8 object bits")
11041106
{
11051107
config.bv_encoding.object_bits = 8;
1106-
const auto converted = convert_expr_to_smt(address_of_foo, object_map);
1108+
const auto converted = convert_expr_to_smt(
1109+
address_of_foo, object_map, object_size.make_application);
11071110
CHECK(object_map.at(foo).unique_id == 1);
11081111
CHECK(
11091112
converted == smt_bit_vector_theoryt::concat(
@@ -1113,7 +1116,8 @@ TEST_CASE(
11131116
SECTION("16 object bits")
11141117
{
11151118
config.bv_encoding.object_bits = 16;
1116-
const auto converted = convert_expr_to_smt(address_of_foo, object_map);
1119+
const auto converted = convert_expr_to_smt(
1120+
address_of_foo, object_map, object_size.make_application);
11171121
CHECK(object_map.at(foo).unique_id == 1);
11181122
CHECK(
11191123
converted == smt_bit_vector_theoryt::concat(
@@ -1129,15 +1133,17 @@ TEST_CASE(
11291133
exprt address_of = address_of_exprt{foo};
11301134
address_of.type() = bool_typet{};
11311135
REQUIRE_THROWS_MATCHES(
1132-
convert_expr_to_smt(address_of, object_map),
1136+
convert_expr_to_smt(
1137+
address_of, object_map, object_size.make_application),
11331138
invariant_failedt,
11341139
invariant_failure_containing(
11351140
"Result of the address_of operator should have pointer type."));
11361141
}
11371142
SECTION("Objects should already be tracked")
11381143
{
11391144
REQUIRE_THROWS_MATCHES(
1140-
convert_expr_to_smt(address_of_exprt{foo}, object_map),
1145+
convert_expr_to_smt(
1146+
address_of_exprt{foo}, object_map, object_size.make_application),
11411147
invariant_failedt,
11421148
invariant_failure_containing("Objects should be tracked before "
11431149
"converting their address to SMT terms"));
@@ -1149,7 +1155,8 @@ TEST_CASE(
11491155
track_expression_objects(address_of_foo, ns, object_map);
11501156
object_map.at(foo).unique_id = 256;
11511157
REQUIRE_THROWS_MATCHES(
1152-
convert_expr_to_smt(address_of_exprt{foo}, object_map),
1158+
convert_expr_to_smt(
1159+
address_of_exprt{foo}, object_map, object_size.make_application),
11531160
invariant_failedt,
11541161
invariant_failure_containing("There should be sufficient bits to "
11551162
"encode unique object identifier."));
@@ -1161,7 +1168,8 @@ TEST_CASE(
11611168
track_expression_objects(address_of_foo, ns, object_map);
11621169
object_map.at(foo).unique_id = 256;
11631170
REQUIRE_THROWS_MATCHES(
1164-
convert_expr_to_smt(address_of_exprt{foo}, object_map),
1171+
convert_expr_to_smt(
1172+
address_of_exprt{foo}, object_map, object_size.make_application),
11651173
invariant_failedt,
11661174
invariant_failure_containing("Pointer should be wider than object_bits "
11671175
"in order to allow for offset encoding."));
@@ -1174,7 +1182,8 @@ TEST_CASE(
11741182
notequal_exprt{address_of_exprt{foo}, address_of_exprt{bar}};
11751183
track_expression_objects(comparison, ns, object_map);
11761184
INFO("Expression " + comparison.pretty(1, 0));
1177-
const auto converted = convert_expr_to_smt(comparison, object_map);
1185+
const auto converted =
1186+
convert_expr_to_smt(comparison, object_map, object_size.make_application);
11781187
CHECK(object_map.at(foo).unique_id == 2);
11791188
CHECK(object_map.at(bar).unique_id == 1);
11801189
CHECK(

0 commit comments

Comments
 (0)