diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Solver/STPBuilder.h | 4 | ||||
-rw-r--r-- | lib/Solver/Solver.cpp | 9 |
2 files changed, 13 insertions, 0 deletions
diff --git a/lib/Solver/STPBuilder.h b/lib/Solver/STPBuilder.h index 30713253..4353857c 100644 --- a/lib/Solver/STPBuilder.h +++ b/lib/Solver/STPBuilder.h @@ -17,7 +17,11 @@ #include <map> #define Expr VCExpr +#ifdef HAVE_EXT_STP +#include <stp/c_interface.h> +#else #include "../../stp/c_interface/c_interface.h" +#endif #if ENABLE_STPLOG == 1 #include "stp/stplog.h" diff --git a/lib/Solver/Solver.cpp b/lib/Solver/Solver.cpp index 1d13a11d..4059a82b 100644 --- a/lib/Solver/Solver.cpp +++ b/lib/Solver/Solver.cpp @@ -453,6 +453,15 @@ STPSolverImpl::STPSolverImpl(STPSolver *_solver, bool _useForkedSTP, bool _optim assert(vc && "unable to create validity checker"); assert(builder && "unable to create STPBuilder"); +#ifdef HAVE_EXT_STP + // In newer versions of STP, a memory management mechanism has been + // introduced that automatically invalidates certain C interface + // pointers at vc_Destroy time. This caused double-free errors + // due to the ExprHandle destructor also attempting to invalidate + // the pointers using vc_DeleteExpr. By setting EXPRDELETE to 0 + // we restore the old behaviour. + vc_setInterfaceFlags(vc, EXPRDELETE, 0); +#endif vc_registerErrorHandler(::stp_error_handler); if (useForkedSTP) { |