Fix crash when passing a mate/stalemate position
authorMarco Costalba <mcostalba@gmail.com>
Sat, 24 Sep 2016 05:30:37 +0000 (07:30 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 24 Sep 2016 05:37:52 +0000 (07:37 +0200)
Both Tablebases::filter_root_moves() and
extract_ponder_from_tt(9 were unable to handle
a mate/stalemate position.

Spotted and reported by Dann Corbit.

Added some mate/stalemate positions to bench so
to early catch this regression in the future.

No functional change.

src/benchmark.cpp
src/search.cpp
src/thread.cpp

index 9512540..f2d1f06 100644 (file)
@@ -76,7 +76,14 @@ const vector<string> Defaults = {
   "8/8/3P3k/8/1p6/8/1P6/1K3n2 b - - 0 1",  // Nd2 - draw
 
   // 7-man positions
-  "8/R7/2q5/8/6k1/8/1P5p/K6R w - - 0 124"  // Draw
+  "8/R7/2q5/8/6k1/8/1P5p/K6R w - - 0 124", // Draw
+
+  // Mate and stalemate positions
+  "8/8/8/8/8/6k1/6p1/6K1 w - -",
+  "5k2/5P2/5K2/8/8/8/8/8 b - -",
+  "8/8/8/8/8/4k3/4p3/4K3 w - -",
+  "8/8/8/8/8/5K2/8/3Q1k2 b - -",
+  "7k/7P/6K1/8/3B4/8/8/8 b - -"
 };
 
 } // namespace
index 6b12e3f..610991f 100644 (file)
@@ -1596,6 +1596,9 @@ bool RootMove::extract_ponder_from_tt(Position& pos)
 
     assert(pv.size() == 1);
 
+    if (!pv[0])
+        return false;
+
     pos.do_move(pv[0], st, pos.gives_check(pv[0]));
     TTEntry* tte = TT.probe(pos.key(), ttHit);
 
index b38bdd6..2923c07 100644 (file)
@@ -184,7 +184,8 @@ void ThreadPool::start_thinking(Position& pos, StateListPtr& states,
           || std::count(limits.searchmoves.begin(), limits.searchmoves.end(), m))
           rootMoves.push_back(Search::RootMove(m));
 
-  Tablebases::filter_root_moves(pos, rootMoves);
+  if (!rootMoves.empty())
+      Tablebases::filter_root_moves(pos, rootMoves);
 
   // After ownership transfer 'states' becomes empty, so if we stop the search
   // and call 'go' again without setting a new position states.get() == NULL.