Skip to content

Commit e3a1bba

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 3877e0f commit e3a1bba

7 files changed

+45
-34
lines changed

src/goto-checker/goto_symex_property_decider.cpp

Lines changed: 5 additions & 0 deletions
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

Lines changed: 3 additions & 0 deletions
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

Lines changed: 1 addition & 2 deletions
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

Lines changed: 1 addition & 2 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,28 @@ solver_factoryt::solvert::solvert(
6565
{
6666
}
6767

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

7492
void solver_factoryt::set_decision_procedure_time_limit(
@@ -81,22 +99,6 @@ void solver_factoryt::set_decision_procedure_time_limit(
8199
decision_procedure.set_time_limit_seconds(timeout_seconds);
82100
}
83101

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-
100102
std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_solver()
101103
{
102104
if(options.get_bool_option("dimacs"))
@@ -339,8 +341,8 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
339341

340342
set_decision_procedure_time_limit(*bv_pointers);
341343

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

346348
std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_dimacs()
@@ -352,7 +354,7 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_dimacs()
352354

353355
std::string filename = options.get_option("outfile");
354356

355-
auto bv_dimacs =
357+
std::unique_ptr<boolbvt> bv_dimacs =
356358
std::make_unique<bv_dimacst>(ns, *prop, message_handler, filename);
357359

358360
return std::make_unique<solvert>(std::move(bv_dimacs), std::move(prop));
@@ -367,7 +369,8 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_external_sat()
367369
auto prop =
368370
std::make_unique<external_satt>(message_handler, external_sat_solver);
369371

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

372375
return std::make_unique<solvert>(std::move(bv_pointers), std::move(prop));
373376
}
@@ -390,7 +393,8 @@ std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_bv_refinement()
390393
info.refine_arithmetic = options.get_bool_option("refine-arithmetic");
391394
info.message_handler = &message_handler;
392395

393-
auto decision_procedure = std::make_unique<bv_refinementt>(info);
396+
std::unique_ptr<boolbvt> decision_procedure =
397+
std::make_unique<bv_refinementt>(info);
394398
set_decision_procedure_time_limit(*decision_procedure);
395399
return std::make_unique<solvert>(
396400
std::move(decision_procedure), std::move(prop));
@@ -415,7 +419,8 @@ solver_factoryt::get_string_refinement()
415419
info.refine_arithmetic = options.get_bool_option("refine-arithmetic");
416420
info.message_handler = &message_handler;
417421

418-
auto decision_procedure = std::make_unique<string_refinementt>(info);
422+
std::unique_ptr<boolbvt> decision_procedure =
423+
std::make_unique<string_refinementt>(info);
419424
set_decision_procedure_time_limit(*decision_procedure);
420425
return std::make_unique<solvert>(
421426
std::move(decision_procedure), std::move(prop));

src/goto-checker/solver_factory.h

Lines changed: 5 additions & 5 deletions
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)