[Coin-discuss] Purify UMR CoinFactorization::pivotOneOtherRow
Matthew Galati
Matthew.Galati at sas.com
Tue May 23 21:32:53 EDT 2006
I recall CLP ignoring some UMR's in past postings. This one comes up a lot - is it safe?
Matt
[I] Starting Purify'd C:\cygwin\home\magala\sasopt\cbuild\exemilpNET03\exemilp\Debug\exemilp.exe at 05/23/2006 21:27:41
[I] Starting main
[W] UMR: Uninitialized memory read in CoinFactorization::pivotOneOtherRow(int,int) {47 occurrences}
Reading 4 bytes from 0x038fda50 (4 bytes at 0x038fda50 uninitialized)
Address 0x038fda50 is 11000 bytes into a 234016 byte block at 0x038faf58
Address 0x038fda50 points to a C++ new block in heap 0x00390000
Thread ID: 0xb4c
Error location
CoinFactorization::pivotOneOtherRow(int,int) [c:\cygwin\home\magala\coin\coin\coinfactorization1.cpp:1949]
if ( i + 1 < endColumn ) {
#endif
nextIRow = indexRowU_[i + 1];
=> nextValue = elementU_[i + 1];
#ifdef ZEROFAULT
}
#endif
CoinFactorization::factorSparse(void) [c:\cygwin\home\magala\coin\coin\coinfactorization2.cpp:322]
break;
}
} else {
=> if ( !pivotOneOtherRow ( pivotRow, pivotColumn ) ) {
status = -99;
count=biggerDimension_+1;
break;
CoinFactorization::factor(void) [c:\cygwin\home\magala\coin\coin\coinfactorization1.cpp:980]
CoinFactorization::factor ( )
{
//sparse
=> status_ = factorSparse ( );
switch ( status_ ) {
case 0: //finished
totalElements_ = 0;
ClpFactorization::factorize(ClpSimplex *,int,bool) [c:\cygwin\home\magala\coin\clp\clpfactorization.cpp:361]
preProcess ( 2 );
else
preProcess ( 3 ); // no row copy
=> factor ( );
if (status_==-99) {
// get more memory
areaFactor(2.0*areaFactor());
ClpSimplex::internalFactorize(int) [c:\cygwin\home\magala\coin\clp\clpsimplex.cpp:1395]
exit(0);
k++;
}
=> int status = factorization_->factorize(this, solveType,valuesPass);
if (status) {
handler_->message(CLP_SIMPLEX_BADFACTOR,messages_)
<<status
ClpSimplexDual::statusOfProblemInDual(int&,int,double *,ClpDataSave&,int) [c:\cygwin\home\magala\coin\clp\clpsimplexdual.cpp:3292]
dualRowPivot_->saveWeights(this,1);
if (type) {
// is factorization okay?
=> if (internalFactorize(1)) {
// no - restore previous basis
unflagVariables = false;
assert (type==1);
ClpSimplexDual::gutsOfDual(int,double *&,int,ClpDataSave&) [c:\cygwin\home\magala\coin\clp\clpsimplexdual.cpp:388]
}
// may factorize, checks if problem finished
statusOfProblemInDual(lastCleaned,factorType,saveDuals,data,
=> ifValuesPass);
// If values pass then do easy ones on first time
if (ifValuesPass&&
progress_->lastIterationNumber(0)<0&&saveDuals) {
ClpSimplexDual::dual(int,int) [c:\cygwin\home\magala\coin\clp\clpsimplexdual.cpp:452]
int initialStatus=problemStatus_;
if (!returnCode)
=> gutsOfDual(ifValuesPass,saveDuals,initialStatus,data);
if (problemStatus_==10)
startFinishOptions |= 1;
finishSolve(startFinishOptions);
ClpSimplex::dual(int,int) [c:\cygwin\home\magala\coin\clp\clpsimplex.cpp:4408]
As far as I can see this is perfectly safe.
*/
=> int returnCode = ((ClpSimplexDual *) this)->dual(ifValuesPass, startFinishOptions);
if ((specialOptions_&2048)!=0&&problemStatus_==10&&!numberPrimalInfeasibilities_
&&sumDualInfeasibilities_<1000.0*dualTolerance_&&perturbation_>=100)
problemStatus_=0; // ignore
OsiClpSolverInterface::resolve(void) [c:\cygwin\home\magala\coin\osi\osiclp\osiclpsolverinterface.cpp:475]
}
} else {
if((specialOptions_&1)==0) {
=> modelPtr_->dual(0,startFinishOptions);
} else {
crunch();
}
Allocation location
new(UINT) [f:\vs70builds\3077\vc\crtbld\crt\src\newop.cpp:10]
<>=(UINT) [f:\vs70builds\3077\vc\crtbld\crt\src\newaop.cpp:7]
CoinFactorization::getAreas(int,int,int,int) [c:\cygwin\home\magala\coin\coin\coinfactorization1.cpp:616]
lengthAreaU_ = (CoinBigIndex) (areaFactor_*lengthAreaU_);
lengthAreaL_ = (CoinBigIndex) (areaFactor_*lengthAreaL_);
}
=> elementU_ = new double [ lengthAreaU_ ];
indexRowU_ = new int [ lengthAreaU_ ];
indexColumnU_ = new int [ lengthAreaU_ ];
elementL_ = new double [ lengthAreaL_ ];
ClpFactorization::factorize(ClpSimplex *,int,bool) [c:\cygwin\home\magala\coin\clp\clpfactorization.cpp:315]
#else
getAreas ( numberRows,
numberRowBasic+numberColumnBasic, numberElements,
=> 2 * numberElements );
#endif
//fill
// Fill in counts so we can skip part of preProcess
ClpSimplex::internalFactorize(int) [c:\cygwin\home\magala\coin\clp\clpsimplex.cpp:1395]
exit(0);
k++;
}
=> int status = factorization_->factorize(this, solveType,valuesPass);
if (status) {
handler_->message(CLP_SIMPLEX_BADFACTOR,messages_)
<<status
ClpSimplexDual::statusOfProblemInDual(int&,int,double *,ClpDataSave&,int) [c:\cygwin\home\magala\coin\clp\clpsimplexdual.cpp:3292]
dualRowPivot_->saveWeights(this,1);
if (type) {
// is factorization okay?
=> if (internalFactorize(1)) {
// no - restore previous basis
unflagVariables = false;
assert (type==1);
ClpSimplexDual::gutsOfDual(int,double *&,int,ClpDataSave&) [c:\cygwin\home\magala\coin\clp\clpsimplexdual.cpp:388]
}
// may factorize, checks if problem finished
statusOfProblemInDual(lastCleaned,factorType,saveDuals,data,
=> ifValuesPass);
// If values pass then do easy ones on first time
if (ifValuesPass&&
progress_->lastIterationNumber(0)<0&&saveDuals) {
ClpSimplexDual::dual(int,int) [c:\cygwin\home\magala\coin\clp\clpsimplexdual.cpp:452]
int initialStatus=problemStatus_;
if (!returnCode)
=> gutsOfDual(ifValuesPass,saveDuals,initialStatus,data);
if (problemStatus_==10)
startFinishOptions |= 1;
finishSolve(startFinishOptions);
ClpSimplex::dual(int,int) [c:\cygwin\home\magala\coin\clp\clpsimplex.cpp:4408]
As far as I can see this is perfectly safe.
*/
=> int returnCode = ((ClpSimplexDual *) this)->dual(ifValuesPass, startFinishOptions);
if ((specialOptions_&2048)!=0&&problemStatus_==10&&!numberPrimalInfeasibilities_
&&sumDualInfeasibilities_<1000.0*dualTolerance_&&perturbation_>=100)
problemStatus_=0; // ignore
OsiClpSolverInterface::resolve(void) [c:\cygwin\home\magala\coin\osi\osiclp\osiclpsolverinterface.cpp:475]
}
} else {
if((specialOptions_&1)==0) {
=> modelPtr_->dual(0,startFinishOptions);
} else {
crunch();
}
More information about the Coin-discuss
mailing list