Skip to content

Commit 648b8e3

Browse files
authored
Merge pull request #6078 from thomasspriggs/tas/solver_unique_ptr
Manage lifetime of MiniSat and Glucose solver pointers using unique_ptr
2 parents 3984250 + 3547708 commit 648b8e3

File tree

5 files changed

+34
-84
lines changed

5 files changed

+34
-84
lines changed

scripts/expected_doxygen_warnings.txt

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,3 @@
1-
/home/runner/work/cbmc/cbmc/src/solvers/sat/satcheck_glucose.cpp:246: warning: no matching class member found for
2-
template
3-
satcheck_glucose_baset< Glucose::Solver >::~satcheck_glucose_baset()
4-
5-
/home/runner/work/cbmc/cbmc/src/solvers/sat/satcheck_glucose.cpp:252: warning: no matching class member found for
6-
template
7-
satcheck_glucose_baset< Glucose::SimpSolver >::~satcheck_glucose_baset()
8-
9-
/home/runner/work/cbmc/cbmc/src/solvers/sat/satcheck_minisat2.cpp:313: warning: no matching class member found for
10-
template
11-
satcheck_minisat2_baset< Minisat::Solver >::~satcheck_minisat2_baset()
12-
13-
/home/runner/work/cbmc/cbmc/src/solvers/sat/satcheck_minisat2.cpp:319: warning: no matching class member found for
14-
template
15-
satcheck_minisat2_baset< Minisat::SimpSolver >::~satcheck_minisat2_baset()
16-
171
warning: Include graph for 'goto_instrument_parse_options.cpp' not generated, too many nodes (97), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
182
warning: Included by graph for 'goto_functions.h' not generated, too many nodes (66), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
193
warning: Included by graph for 'goto_model.h' not generated, too many nodes (111), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.

src/solvers/sat/satcheck_glucose.cpp

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Author: Daniel Kroening, [email protected]
1515
#include <stack>
1616

1717
#include <util/invariant.h>
18+
#include <util/make_unique.h>
1819
#include <util/threeval.h>
1920

2021
#include <core/Solver.h>
@@ -243,23 +244,13 @@ void satcheck_glucose_baset<T>::set_assignment(literalt a, bool value)
243244

244245
template <typename T>
245246
satcheck_glucose_baset<T>::satcheck_glucose_baset(
246-
T *_solver,
247247
message_handlert &message_handler)
248-
: cnf_solvert(message_handler), solver(_solver)
248+
: cnf_solvert(message_handler), solver(util_make_unique<T>())
249249
{
250250
}
251251

252-
template<>
253-
satcheck_glucose_baset<Glucose::Solver>::~satcheck_glucose_baset()
254-
{
255-
delete solver;
256-
}
257-
258-
template<>
259-
satcheck_glucose_baset<Glucose::SimpSolver>::~satcheck_glucose_baset()
260-
{
261-
delete solver;
262-
}
252+
template <typename T>
253+
satcheck_glucose_baset<T>::~satcheck_glucose_baset() = default;
263254

264255
template<typename T>
265256
bool satcheck_glucose_baset<T>::is_in_conflict(literalt a) const
@@ -285,21 +276,8 @@ void satcheck_glucose_baset<T>::set_assumptions(const bvt &bv)
285276
}
286277
}
287278

288-
satcheck_glucose_no_simplifiert::satcheck_glucose_no_simplifiert(
289-
message_handlert &message_handler)
290-
: satcheck_glucose_baset<Glucose::Solver>(
291-
new Glucose::Solver,
292-
message_handler)
293-
{
294-
}
295-
296-
satcheck_glucose_simplifiert::satcheck_glucose_simplifiert(
297-
message_handlert &message_handler)
298-
: satcheck_glucose_baset<Glucose::SimpSolver>(
299-
new Glucose::SimpSolver,
300-
message_handler)
301-
{
302-
}
279+
template class satcheck_glucose_baset<Glucose::Solver>;
280+
template class satcheck_glucose_baset<Glucose::SimpSolver>;
303281

304282
void satcheck_glucose_simplifiert::set_frozen(literalt a)
305283
{

src/solvers/sat/satcheck_glucose.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ Author: Daniel Kroening, [email protected]
1414

1515
#include <solvers/hardness_collector.h>
1616

17+
#include <memory>
18+
1719
// Select one: basic solver or with simplification.
1820
// Note that the solver with simplifier isn't really robust
1921
// when used incrementally, as variables may disappear
@@ -29,8 +31,10 @@ template <typename T>
2931
class satcheck_glucose_baset : public cnf_solvert, public hardness_collectort
3032
{
3133
public:
32-
satcheck_glucose_baset(T *, message_handlert &message_handler);
33-
virtual ~satcheck_glucose_baset();
34+
explicit satcheck_glucose_baset(message_handlert &message_handler);
35+
/// A default destructor defined in the `.cpp` is used to ensure the
36+
/// unique_ptr to the solver is correctly destroyed.
37+
~satcheck_glucose_baset() override;
3438

3539
tvt l_get(literalt a) const override;
3640

@@ -70,7 +74,7 @@ class satcheck_glucose_baset : public cnf_solvert, public hardness_collectort
7074
protected:
7175
resultt do_prop_solve() override;
7276

73-
T *solver;
77+
std::unique_ptr<T> solver;
7478

7579
void add_variables();
7680
bvt assumptions;
@@ -82,15 +86,15 @@ class satcheck_glucose_no_simplifiert:
8286
public satcheck_glucose_baset<Glucose::Solver>
8387
{
8488
public:
85-
explicit satcheck_glucose_no_simplifiert(message_handlert &message_handler);
89+
using satcheck_glucose_baset<Glucose::Solver>::satcheck_glucose_baset;
8690
const std::string solver_text() override;
8791
};
8892

8993
class satcheck_glucose_simplifiert:
9094
public satcheck_glucose_baset<Glucose::SimpSolver>
9195
{
9296
public:
93-
explicit satcheck_glucose_simplifiert(message_handlert &message_handler);
97+
using satcheck_glucose_baset<Glucose::SimpSolver>::satcheck_glucose_baset;
9498
const std::string solver_text() override;
9599
void set_frozen(literalt a) override;
96100
bool is_eliminated(literalt a) const;

src/solvers/sat/satcheck_minisat2.cpp

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Author: Daniel Kroening, [email protected]
1818
#include <stack>
1919

2020
#include <util/invariant.h>
21+
#include <util/make_unique.h>
2122
#include <util/threeval.h>
2223

2324
#include <minisat/core/Solver.h>
@@ -227,7 +228,7 @@ propt::resultt satcheck_minisat2_baset<T>::do_prop_solve()
227228

228229
if(time_limit_seconds != 0)
229230
{
230-
solver_to_interrupt = solver;
231+
solver_to_interrupt = solver.get();
231232
old_handler = signal(SIGALRM, interrupt_solver);
232233
if(old_handler == SIG_ERR)
233234
log.warning() << "Failed to set solver time limit" << messaget::eom;
@@ -241,7 +242,7 @@ propt::resultt satcheck_minisat2_baset<T>::do_prop_solve()
241242
{
242243
alarm(0);
243244
signal(SIGALRM, old_handler);
244-
solver_to_interrupt = solver;
245+
solver_to_interrupt = solver.get();
245246
}
246247

247248
#else // _WIN32
@@ -308,23 +309,15 @@ void satcheck_minisat2_baset<T>::set_assignment(literalt a, bool value)
308309

309310
template <typename T>
310311
satcheck_minisat2_baset<T>::satcheck_minisat2_baset(
311-
T *_solver,
312312
message_handlert &message_handler)
313-
: cnf_solvert(message_handler), solver(_solver), time_limit_seconds(0)
313+
: cnf_solvert(message_handler),
314+
solver(util_make_unique<T>()),
315+
time_limit_seconds(0)
314316
{
315317
}
316318

317-
template<>
318-
satcheck_minisat2_baset<Minisat::Solver>::~satcheck_minisat2_baset()
319-
{
320-
delete solver;
321-
}
322-
323-
template<>
324-
satcheck_minisat2_baset<Minisat::SimpSolver>::~satcheck_minisat2_baset()
325-
{
326-
delete solver;
327-
}
319+
template <typename T>
320+
satcheck_minisat2_baset<T>::~satcheck_minisat2_baset() = default;
328321

329322
template<typename T>
330323
bool satcheck_minisat2_baset<T>::is_in_conflict(literalt a) const
@@ -353,21 +346,8 @@ void satcheck_minisat2_baset<T>::set_assumptions(const bvt &bv)
353346
}
354347
}
355348

356-
satcheck_minisat_no_simplifiert::satcheck_minisat_no_simplifiert(
357-
message_handlert &message_handler)
358-
: satcheck_minisat2_baset<Minisat::Solver>(
359-
new Minisat::Solver,
360-
message_handler)
361-
{
362-
}
363-
364-
satcheck_minisat_simplifiert::satcheck_minisat_simplifiert(
365-
message_handlert &message_handler)
366-
: satcheck_minisat2_baset<Minisat::SimpSolver>(
367-
new Minisat::SimpSolver,
368-
message_handler)
369-
{
370-
}
349+
template class satcheck_minisat2_baset<Minisat::Solver>;
350+
template class satcheck_minisat2_baset<Minisat::SimpSolver>;
371351

372352
void satcheck_minisat_simplifiert::set_frozen(literalt a)
373353
{

src/solvers/sat/satcheck_minisat2.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ Author: Daniel Kroening, [email protected]
1414

1515
#include <solvers/hardness_collector.h>
1616

17+
#include <memory>
18+
1719
// Select one: basic solver or with simplification.
1820
// Note that the solver with simplifier isn't really robust
1921
// when used incrementally, as variables may disappear
@@ -29,8 +31,10 @@ template <typename T>
2931
class satcheck_minisat2_baset : public cnf_solvert, public hardness_collectort
3032
{
3133
public:
32-
satcheck_minisat2_baset(T *, message_handlert &message_handler);
33-
virtual ~satcheck_minisat2_baset();
34+
explicit satcheck_minisat2_baset(message_handlert &message_handler);
35+
/// A default destructor defined in the `.cpp` is used to ensure the
36+
/// unique_ptr to the solver is correctly destroyed.
37+
~satcheck_minisat2_baset() override;
3438

3539
tvt l_get(literalt a) const override final;
3640

@@ -81,7 +85,7 @@ class satcheck_minisat2_baset : public cnf_solvert, public hardness_collectort
8185
protected:
8286
resultt do_prop_solve() override;
8387

84-
T *solver;
88+
std::unique_ptr<T> solver;
8589
uint32_t time_limit_seconds;
8690

8791
void add_variables();
@@ -94,15 +98,15 @@ class satcheck_minisat_no_simplifiert:
9498
public satcheck_minisat2_baset<Minisat::Solver>
9599
{
96100
public:
97-
explicit satcheck_minisat_no_simplifiert(message_handlert &message_handler);
101+
using satcheck_minisat2_baset<Minisat::Solver>::satcheck_minisat2_baset;
98102
const std::string solver_text() override;
99103
};
100104

101105
class satcheck_minisat_simplifiert:
102106
public satcheck_minisat2_baset<Minisat::SimpSolver>
103107
{
104108
public:
105-
explicit satcheck_minisat_simplifiert(message_handlert &message_handler);
109+
using satcheck_minisat2_baset<Minisat::SimpSolver>::satcheck_minisat2_baset;
106110
const std::string solver_text() override final;
107111
void set_frozen(literalt a) override final;
108112
bool is_eliminated(literalt a) const;

0 commit comments

Comments
 (0)