[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