Skip to content

Commit 2304921

Browse files
committed
Add smt_is_dynamic_objectt function
The SMT function which this commit implements declaration / application / definition will be used in follow up commits in order to convert dynamic_object expressions to smt terms.
1 parent fb11e5b commit 2304921

File tree

5 files changed

+117
-0
lines changed

5 files changed

+117
-0
lines changed

src/solvers/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ SRC = $(BOOLEFORCE_SRC) \
204204
smt2_incremental/convert_expr_to_smt.cpp \
205205
smt2_incremental/object_tracking.cpp \
206206
smt2_incremental/type_size_mapping.cpp \
207+
smt2_incremental/smt_is_dynamic_object.cpp \
207208
smt2_incremental/smt_object_size.cpp \
208209
smt2_incremental/smt_response_validation.cpp \
209210
smt2_incremental/smt_solver_process.cpp \
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Author: Diffblue Ltd.
2+
3+
#include "smt_is_dynamic_object.h"
4+
5+
#include <util/c_types.h>
6+
#include <util/config.h>
7+
8+
#include <solvers/smt2_incremental/theories/smt_core_theory.h>
9+
10+
static smt_declare_function_commandt
11+
make_is_dynamic_object_function_declaration()
12+
{
13+
return smt_declare_function_commandt{
14+
smt_identifier_termt{"is_dynamic_object", smt_bool_sortt{}},
15+
{smt_bit_vector_sortt{config.bv_encoding.object_bits}}};
16+
}
17+
18+
smt_is_dynamic_objectt::smt_is_dynamic_objectt()
19+
: declaration{make_is_dynamic_object_function_declaration()},
20+
make_application{smt_command_functiont{declaration}}
21+
{
22+
}
23+
24+
smt_commandt smt_is_dynamic_objectt::make_definition(
25+
std::size_t unique_id,
26+
bool is_dynamic_object) const
27+
{
28+
const auto id_sort =
29+
declaration.parameter_sorts().at(0).get().cast<smt_bit_vector_sortt>();
30+
INVARIANT(id_sort, "Object identifiers are expected to have bit vector sort");
31+
const auto bit_vector_of_id =
32+
smt_bit_vector_constant_termt{unique_id, *id_sort};
33+
return smt_assert_commandt{smt_core_theoryt::equal(
34+
make_application(std::vector<smt_termt>{bit_vector_of_id}),
35+
smt_bool_literal_termt{is_dynamic_object})};
36+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Author: Diffblue Ltd.
2+
3+
#ifndef CPROVER_SOLVERS_SMT2_INCREMENTAL_SMT_IS_DYNAMIC_OBJECT_H
4+
#define CPROVER_SOLVERS_SMT2_INCREMENTAL_SMT_IS_DYNAMIC_OBJECT_H
5+
6+
#include <solvers/smt2_incremental/ast/smt_commands.h>
7+
#include <solvers/smt2_incremental/ast/smt_terms.h>
8+
9+
struct smt_is_dynamic_objectt final
10+
{
11+
smt_is_dynamic_objectt();
12+
/// The command for declaring the is_dynamic_object function. The defined
13+
/// function takes a bit vector encoded unique object identifier and returns
14+
/// a boolean value.
15+
smt_declare_function_commandt declaration;
16+
/// Function which makes applications of the smt function.
17+
using make_applicationt =
18+
smt_function_application_termt::factoryt<smt_command_functiont>;
19+
make_applicationt make_application;
20+
/// Makes the command to define the resulting \p size of calling the is
21+
/// dynamic object function with \p unique_id.
22+
smt_commandt
23+
make_definition(std::size_t unique_id, bool is_dynamic_object) const;
24+
};
25+
26+
#endif // CPROVER_SOLVERS_SMT2_INCREMENTAL_SMT_IS_DYNAMIC_OBJECT_H

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ SRC += analyses/ai/ai.cpp \
110110
solvers/smt2_incremental/convert_expr_to_smt.cpp \
111111
solvers/smt2_incremental/object_tracking.cpp \
112112
solvers/smt2_incremental/smt2_incremental_decision_procedure.cpp \
113+
solvers/smt2_incremental/smt_is_dynamic_object.cpp \
113114
solvers/smt2_incremental/smt_object_size.cpp \
114115
solvers/smt2_incremental/smt_response_validation.cpp \
115116
solvers/smt2_incremental/smt_to_smt2_string.cpp \
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Author: Diffblue Ltd.
2+
3+
#include <util/c_types.h>
4+
#include <util/config.h>
5+
6+
#include <solvers/smt2_incremental/smt_is_dynamic_object.h>
7+
#include <solvers/smt2_incremental/theories/smt_core_theory.h>
8+
#include <testing-utils/use_catch.h>
9+
10+
TEST_CASE("Test smt_is_dynamic_objectt", "[core][smt2_incremental]")
11+
{
12+
const std::size_t object_bits = GENERATE(8, 16);
13+
INFO("Using " + std::to_string(object_bits) + " object id bits.");
14+
// Configuration needs to be set because smt_is_dynamic_objectt uses it.
15+
config.ansi_c.mode = configt::ansi_ct::flavourt::GCC;
16+
config.ansi_c.set_arch_spec_x86_64();
17+
config.bv_encoding.object_bits = object_bits;
18+
const smt_is_dynamic_objectt is_dynamic_object;
19+
SECTION("Declare function")
20+
{
21+
CHECK(
22+
is_dynamic_object.declaration ==
23+
smt_declare_function_commandt{
24+
smt_identifier_termt{"is_dynamic_object", smt_bool_sortt{}},
25+
{smt_bit_vector_sortt{object_bits}}});
26+
}
27+
SECTION("Apply function")
28+
{
29+
const smt_identifier_termt object_id{
30+
"foo", smt_bit_vector_sortt{object_bits}};
31+
const smt_function_application_termt function_application =
32+
is_dynamic_object.make_application(std::vector<smt_termt>{object_id});
33+
CHECK(
34+
function_application.function_identifier() ==
35+
smt_identifier_termt{"is_dynamic_object", smt_bool_sortt{}});
36+
REQUIRE(function_application.arguments().size() == 1);
37+
REQUIRE(function_application.arguments().at(0).get() == object_id);
38+
}
39+
SECTION("Define result")
40+
{
41+
const bool dynamic_status = GENERATE(true, false);
42+
INFO(
43+
"Testing for dynamic status of " +
44+
std::string(dynamic_status ? "true" : "false"));
45+
const smt_commandt definition =
46+
is_dynamic_object.make_definition(42, dynamic_status);
47+
CHECK(
48+
definition == smt_assert_commandt{smt_core_theoryt::equal(
49+
is_dynamic_object.make_application(std::vector<smt_termt>{
50+
smt_bit_vector_constant_termt{42, object_bits}}),
51+
smt_bool_literal_termt{dynamic_status})});
52+
}
53+
}

0 commit comments

Comments
 (0)