Skip to content

Commit ede4a3a

Browse files
committed
Remove dynamic_cast from counterexample beautification code path
We know at solver-construction time whether we have one deriving from boolbvt.
1 parent 89a0470 commit ede4a3a

7 files changed

+45
-35
lines changed

src/goto-checker/goto_symex_property_decider.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ goto_symex_property_decidert::get_decision_procedure() const
120120
return solver->decision_procedure();
121121
}
122122

123+
boolbvt &goto_symex_property_decidert::get_boolbv_decision_procedure() const
124+
{
125+
return solver->boolbv_decision_procedure();
126+
}
127+
123128
symex_target_equationt &goto_symex_property_decidert::get_equation() const
124129
{
125130
return equation;

src/goto-checker/goto_symex_property_decider.h

+3
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ class goto_symex_property_decidert
4747
/// Returns the solver instance
4848
stack_decision_proceduret &get_decision_procedure() const;
4949

50+
/// Returns the solver instance
51+
boolbvt &get_boolbv_decision_procedure() const;
52+
5053
/// Return the equation associated with this instance
5154
symex_target_equationt &get_equation() const;
5255

src/goto-checker/multi_path_symex_checker.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ goto_tracet multi_path_symex_checkert::build_shortest_trace() const
113113
{
114114
// NOLINTNEXTLINE(whitespace/braces)
115115
counterexample_beautificationt{ui_message_handler}(
116-
dynamic_cast<boolbvt &>(property_decider.get_decision_procedure()),
117-
equation);
116+
property_decider.get_boolbv_decision_procedure(), equation);
118117
}
119118

120119
goto_tracet goto_trace;

src/goto-checker/single_loop_incremental_symex_checker.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,7 @@ goto_tracet single_loop_incremental_symex_checkert::build_shortest_trace() const
207207
{
208208
// NOLINTNEXTLINE(whitespace/braces)
209209
counterexample_beautificationt{ui_message_handler}(
210-
dynamic_cast<boolbvt &>(property_decider.get_decision_procedure()),
211-
equation);
210+
property_decider.get_boolbv_decision_procedure(), equation);
212211
}
213212

214213
goto_tracet goto_trace;

src/goto-checker/single_path_symex_checker.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ goto_tracet single_path_symex_checkert::build_shortest_trace() const
144144
{
145145
// NOLINTNEXTLINE(whitespace/braces)
146146
counterexample_beautificationt{ui_message_handler}(
147-
dynamic_cast<boolbvt &>(property_decider->get_decision_procedure()),
147+
property_decider->get_boolbv_decision_procedure(),
148148
property_decider->get_equation());
149149
}
150150

src/goto-checker/solver_factory.cpp

+29-25
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ Author: Daniel Kroening, Peter Schrammel
2929
#include <solvers/sat/satcheck.h>
3030
#include <solvers/smt2_incremental/smt2_incremental_decision_procedure.h>
3131
#include <solvers/smt2_incremental/smt_solver_process.h>
32-
#include <solvers/stack_decision_procedure.h>
3332
#include <solvers/strings/string_refinement.h>
3433

3534
#include <iostream>
@@ -65,10 +64,28 @@ solver_factoryt::solvert::solvert(
6564
{
6665
}
6766

67+
solver_factoryt::solvert::solvert(
68+
std::unique_ptr<boolbvt> p1,
69+
std::unique_ptr<propt> p2)
70+
: prop_ptr(std::move(p2)), decision_procedure_is_boolbvt_ptr(std::move(p1))
71+
{
72+
}
73+
6874
stack_decision_proceduret &solver_factoryt::solvert::decision_procedure() const
6975
{
70-
PRECONDITION(decision_procedure_ptr != nullptr);
71-
return *decision_procedure_ptr;
76+
PRECONDITION(
77+
(decision_procedure_ptr != nullptr) !=
78+
(decision_procedure_is_boolbvt_ptr != nullptr));
79+
if(decision_procedure_ptr)
80+
return *decision_procedure_ptr;
81+
else
82+
return *decision_procedure_is_boolbvt_ptr;
83+
}
84+
85+
boolbvt &solver_factoryt::solvert::boolbv_decision_procedure() const
86+
{
87+
PRECONDITION(decision_procedure_is_boolbvt_ptr != nullptr);
88+
return *decision_procedure_is_boolbvt_ptr;
7289
}
7390

7491
void solver_factoryt::set_decision_procedure_time_limit(
@@ -81,22 +98,6 @@ void solver_factoryt::set_decision_procedure_time_limit(
8198
decision_procedure.set_time_limit_seconds(timeout_seconds);
8299
}
83100

84-
void solver_factoryt::solvert::set_decision_procedure(
85-
std::unique_ptr<stack_decision_proceduret> p)
86-
{
87-
decision_procedure_ptr = std::move(p);
88-
}
89-
90-
void solver_factoryt::solvert::set_prop(std::unique_ptr<propt> p)
91-
{
92-
prop_ptr = std::move(p);
93-
}
94-
95-
void solver_factoryt::solvert::set_ofstream(std::unique_ptr<std::ofstream> p)
96-
{
97-
ofstream_ptr = std::move(p);
98-
}
99-
100101
std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_solver()
101102
{
102103
if(options.get_bool_option("dimacs"))
@@ -339,8 +340,8 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
339340

340341
set_decision_procedure_time_limit(*bv_pointers);
341342

342-
return std::make_unique<solvert>(
343-
std::move(bv_pointers), std::move(sat_solver));
343+
std::unique_ptr<boolbvt> boolbv = std::move(bv_pointers);
344+
return std::make_unique<solvert>(std::move(boolbv), std::move(sat_solver));
344345
}
345346

346347
std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_dimacs()
@@ -352,7 +353,7 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_dimacs()
352353

353354
std::string filename = options.get_option("outfile");
354355

355-
auto bv_dimacs =
356+
std::unique_ptr<boolbvt> bv_dimacs =
356357
std::make_unique<bv_dimacst>(ns, *prop, message_handler, filename);
357358

358359
return std::make_unique<solvert>(std::move(bv_dimacs), std::move(prop));
@@ -367,7 +368,8 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_external_sat()
367368
auto prop =
368369
std::make_unique<external_satt>(message_handler, external_sat_solver);
369370

370-
auto bv_pointers = std::make_unique<bv_pointerst>(ns, *prop, message_handler);
371+
std::unique_ptr<boolbvt> bv_pointers =
372+
std::make_unique<bv_pointerst>(ns, *prop, message_handler);
371373

372374
return std::make_unique<solvert>(std::move(bv_pointers), std::move(prop));
373375
}
@@ -390,7 +392,8 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_bv_refinement()
390392
info.refine_arithmetic = options.get_bool_option("refine-arithmetic");
391393
info.message_handler = &message_handler;
392394

393-
auto decision_procedure = std::make_unique<bv_refinementt>(info);
395+
std::unique_ptr<boolbvt> decision_procedure =
396+
std::make_unique<bv_refinementt>(info);
394397
set_decision_procedure_time_limit(*decision_procedure);
395398
return std::make_unique<solvert>(
396399
std::move(decision_procedure), std::move(prop));
@@ -415,7 +418,8 @@ solver_factoryt::get_string_refinement()
415418
info.refine_arithmetic = options.get_bool_option("refine-arithmetic");
416419
info.message_handler = &message_handler;
417420

418-
auto decision_procedure = std::make_unique<string_refinementt>(info);
421+
std::unique_ptr<boolbvt> decision_procedure =
422+
std::make_unique<string_refinementt>(info);
419423
set_decision_procedure_time_limit(*decision_procedure);
420424
return std::make_unique<solvert>(
421425
std::move(decision_procedure), std::move(prop));

src/goto-checker/solver_factory.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Author: Daniel Kroening, Peter Schrammel
1212
#ifndef CPROVER_GOTO_CHECKER_SOLVER_FACTORY_H
1313
#define CPROVER_GOTO_CHECKER_SOLVER_FACTORY_H
1414

15-
#include <solvers/prop/prop.h>
15+
#include <solvers/flattening/boolbv.h>
1616
#include <solvers/smt2/smt2_dec.h>
1717

1818
#include <memory>
@@ -45,17 +45,17 @@ class solver_factoryt final
4545
solvert(
4646
std::unique_ptr<stack_decision_proceduret> p1,
4747
std::unique_ptr<std::ofstream> p2);
48+
solvert(std::unique_ptr<boolbvt> p1, std::unique_ptr<propt> p2);
4849

4950
stack_decision_proceduret &decision_procedure() const;
51+
boolbvt &boolbv_decision_procedure() const;
5052

51-
void set_decision_procedure(std::unique_ptr<stack_decision_proceduret> p);
52-
void set_prop(std::unique_ptr<propt> p);
53-
void set_ofstream(std::unique_ptr<std::ofstream> p);
54-
53+
private:
5554
// the objects are deleted in the opposite order they appear below
5655
std::unique_ptr<std::ofstream> ofstream_ptr;
5756
std::unique_ptr<propt> prop_ptr;
5857
std::unique_ptr<stack_decision_proceduret> decision_procedure_ptr;
58+
std::unique_ptr<boolbvt> decision_procedure_is_boolbvt_ptr;
5959
};
6060

6161
/// Returns a solvert object

0 commit comments

Comments
 (0)