[Clp-tickets] [COIN-OR Linear Programming Solver] #56: Segmentation fault when setting factorisation
COIN-OR Linear Programming Solver
coin-trac at coin-or.org
Mon May 14 13:58:08 EDT 2012
#56: Segmentation fault when setting factorisation
------------------------+----------------------
Reporter: patra | Owner: somebody
Type: defect | Status: new
Priority: major | Milestone:
Component: component1 | Version:
Keywords: |
------------------------+----------------------
One of my programs reproducibly crashes when asked to solve a large
MIP optimisation problem for given parameters. I should add that this
occurs
rather infrequently, perhaps for about 1% of all tested input parameters
for my
model. The crash only happens after quite a few iteration steps have been
done,
usually more than 10000.
I use Clp as part of Cbc-2.7.6. The version used there is Clp-1.14.6, thus
the
current version of Clp.
This shows a backtrace of a segmentation fault that I've analysed:
{{{
#0 0x0000000000b61564 in ClpFactorization::operator= (this=0x16410d0,
rhs=@0x0) at ClpFactorization.cpp:1293
#1 0x0000000000b61a0b in ClpFactorization::setFactorization
(this=0x16410d0, rhs=@0x0) at ClpFactorization.cpp:2843
#2 0x0000000000be1d07 in ClpSimplex::setFactorization (this=0x14fe700,
factorization=@0x0) at ClpSimplex.cpp:4502
#3 0x0000000000aacf5f in OsiClpSolverInterface::solveFromHotStart
(this=0x12d3ae0) at OsiClpSolverInterface.cpp:2376
#4 0x00000000009a306e in CbcNode::chooseDynamicBranch (this=0x145e650,
model=0x7fff3f843380, lastNode=0x1823990,
numberPassesLeft=4) at CbcNode.cpp:2827
#5 0x000000000096b7a6 in CbcModel::chooseBranch (this=0x7fff3f843380,
newNode=@0x7fff3f83fa78, numberPassesLeft=5,
oldNode=0x1823990, cuts=@0x7fff3f83f020, resolved=@0x7fff3f83f077,
lastws=0x1910b00, lowerBefore=0x1611fd0,
upperBefore=0x152beb0, branches=@0x7fff3f83f068) at CbcModel.cpp:12647
#6 0x0000000000978a74 in CbcModel::doOneNode (this=0x7fff3f843380,
baseModel=0x7fff3f843380, node=@0x7fff3f83fa00,
newNode=@0x7fff3f83fa78) at CbcModel.cpp:14305
#7 0x0000000000994c14 in CbcModel::branchAndBound (this=0x7fff3f843380,
doStatistics=0) at CbcModel.cpp:3800
}}}
In OsiClpSolverInterface::solveFromHotStart, the function setFactorization
is
called, with the internal variable OsiClpSolverInterface::factorization_
as its
argument. Since that internal variable happens to be NULL, a segmentation
fault
occurs further down the calling sequence. The actual bug seems to be that
OsiClpSolverInterface::factorization_ is equal to NULL - which it
shouldn't be -
and not the coding of ClpSimplex::setFactorization or the functions called
by
it.
I've traced the reason for OsiClpSolverInterface::factorization_ being
NULL to
OsiClpSolverInterface::markHotStart [see line 2077 of
OsiClp/OsiClpSolverInterface.cpp]. Since SETUP_HOT is defined by default,
only
the second part of the code is relevant. The segmentation fault that I
have
analysed occurs when factorization_==NULL and small->problemStatus_==3.
This is
why the assertion doesn't signal an error but
OsiClpSolverInterface::factorization_ still is set to zero.
{{{
#ifndef SETUP_HOT
assert (factorization_==NULL);
factorization_ = static_cast<ClpSimplexDual
*>(small)->setupForStrongBranching(spareArrays_,numberRows,
numberColumns,false);
#else
assert (factorization!=NULL || small->problemStatus_ );
factorization_ = factorization;
/* This is where factorization_ is set to NULL while
small->problemStatus_ == 3 */
#endif
}}}
Without really knowing what I'm doing, I've copied the initialisation
statement
from the first part of the #ifdef-statement to the second.
{{{
#ifndef SETUP_HOT
assert (factorization_==NULL);
factorization_ = static_cast<ClpSimplexDual
*>(small)->setupForStrongBranching(spareArrays_,numberRows,
numberColumns,false);
#else
assert (factorization!=NULL || small->problemStatus_ );
factorization_ = factorization;
if( factorization_ == NULL )
factorization_ = static_cast<ClpSimplexDual
*>(small)->setupForStrongBranching(spareArrays_,numberRows,
numberColumns,false);
#endif
}}}
And, to my surprise, it actually seems to cure the problem. The program no
longer crashes, and the computed results are correct. Before this line of
code
is added as a bug fix to the repository, somebody who actually understands
what
that part of the code is supposed to do, should, of course, have a more
in-depth
look first.
--
Ticket URL: <https://projects.coin-or.org/ticket/56>
COIN-OR Linear Programming Solver <http://projects.coin-or.org/Clp>
A linear programming solver.
More information about the Clp-tickets
mailing list