coin-or / Cbc.old

This is a mirror of the subversion repository on COIN-OR
https://projects.coin-or.org/Cbc
Other
89 stars 30 forks source link

[Trac #120] Crash in presolve #84

Open s-c-e opened 5 years ago

s-c-e commented 5 years ago

image

with current SVN, I see crashes in presolve. Here is an example:

#include <coin/OsiClpSolverInterface.hpp>
#include <coin/CbcModel.hpp>
#include <coin/CbcStrategy.hpp>

int main() {
  OsiClpSolverInterface clp;

  for (int i = 0; i < 3; i++) {
    clp.addCol(0, NULL, NULL, 0.0, 1.0, 1.0);
    clp.setInteger(i);
  }

  int indices1[2] = {1, 2};
  double values1[2] = {1.0, 1.0 };
  clp.addRow(2, indices1, values1, 1.0, COIN_DBL_MAX);
  int indices2[2] = {0, 2};
  double values2[2] = {1.0, 1.0, };
  clp.addRow(2, indices2, values2, 1.0, COIN_DBL_MAX);
  int indices3[2] = {0, 1};
  double values3[2] = {1.0, 1.0, };
  clp.addRow(2, indices3, values3, 1.0, COIN_DBL_MAX);

  CbcModel model(clp);

  CbcStrategyDefault strategy;
  strategy.setupPreProcessing(1);
  model.setStrategy(strategy);
  model.initialSolve();
  model.branchAndBound();

  return 0;
}
falk@baltrum:/tmp% g++ test2.cc -I/home/falk/opt/cbc/include -L/home/falk/opt/cbc/lib -lpthread -lCbcSolver -lCbc -lCgl -lClp -lCoinUtils -lOsiClp -lOsi -lz -lrt -lbz2 && ./a.out
Coin0506I Presolve 3 (0) rows, 3 (0) columns and 6 (0) elements
Clp0006I 0  Obj 0 Primal inf 2.9999997 (3)
Clp0006I 3  Obj 1.5
Clp0000I Optimal - objective value 1.5
Clp0032I Optimal objective 1.5 - 3 iterations time 0.002
Clp0000I Optimal - objective value 1.5
Clp0006I 0  Obj 1.5
Clp0006I 0  Obj 1.5
Clp0000I Optimal - objective value 1.5
Clp0006I 0  Obj 1.5 Primal inf 0.4999999 (1) Dual inf 3e+08 (3)
Clp0029I End of values pass after 3 iterations
Clp0006I 3  Obj 2
Clp0006I 3  Obj 2
Clp0000I Optimal - objective value 2
zsh: segmentation fault  ./a.out

valgrind shows the following problem:

==27977== Invalid read of size 4
==27977==    at 0x5D2EBA8: CoinPackedMatrix::CoinPackedMatrix(CoinPackedMatrix const&, int, int, bool) (in /home/falk/opt/cbc-2.7/lib/libCoinUtils.so.0.0.0)
==27977==    by 0x56D12F4: CglProbing::gutsOfGenerateCuts(OsiSolverInterface const&, OsiCuts&, double*, double*, double*, double*, CglTreeInfo*) const (CglProbing.cpp:2040)
==27977==    by 0x56D4C24: CglProbing::generateCutsAndModify(OsiSolverInterface const&, OsiCuts&, CglTreeInfo*) (CglProbing.cpp:1357)
==27977==    by 0x56A3754: CglPreProcess::modified(OsiSolverInterface*, bool, int&, int, int) (CglPreProcess.cpp:3916)
==27977==    by 0x56AA559: CglPreProcess::preProcessNonDefault(OsiSolverInterface&, int, int, int) (CglPreProcess.cpp:2356)
==27977==    by 0x5111AF7: CbcStrategyDefault::setupOther(CbcModel&) (CbcStrategy.cpp:521)
==27977==    by 0x50F8198: CbcModel::branchAndBound(int) (in /home/falk/opt/cbc-2.7/lib/libCbc.so.0.0.0)
==27977==    by 0x400F1F: main (cbc-crash2.cc:29)
==27977==  Address 0x7b640c4 is 4 bytes after a block of size 0 alloc'd
==27977==    at 0x4C26CF7: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27977==    by 0x5D2E93C: CoinPackedMatrix::CoinPackedMatrix(CoinPackedMatrix const&, int, int, bool) (in /home/falk/opt/cbc-2.7/lib/libCoinUtils.so.0.0.0)
==27977==    by 0x56D12F4: CglProbing::gutsOfGenerateCuts(OsiSolverInterface const&, OsiCuts&, double*, double*, double*, double*, CglTreeInfo*) const (CglProbing.cpp:2040)
==27977==    by 0x56D4C24: CglProbing::generateCutsAndModify(OsiSolverInterface const&, OsiCuts&, CglTreeInfo*) (CglProbing.cpp:1357)
==27977==    by 0x56A3754: CglPreProcess::modified(OsiSolverInterface*, bool, int&, int, int) (CglPreProcess.cpp:3916)
==27977==    by 0x56AA559: CglPreProcess::preProcessNonDefault(OsiSolverInterface&, int, int, int) (CglPreProcess.cpp:2356)
==27977==    by 0x5111AF7: CbcStrategyDefault::setupOther(CbcModel&) (CbcStrategy.cpp:521)
==27977==    by 0x50F8198: CbcModel::branchAndBound(int) (in /home/falk/opt/cbc-2.7/lib/libCbc.so.0.0.0)
==27977==    by 0x400F1F: main (cbc-crash2.cc:29)
==27977== 

Maybe there is a problem with the matrix becoming zero-sized.