From 8662bdfa124ae3ec90d9bf88842d9cfab9a43532 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 24 Sep 2016 07:30:37 +0200 Subject: [PATCH] Fix crash when passing a mate/stalemate position 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 | 9 ++++++++- src/search.cpp | 3 +++ src/thread.cpp | 3 ++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/benchmark.cpp b/src/benchmark.cpp index 95125404..f2d1f068 100644 --- a/src/benchmark.cpp +++ b/src/benchmark.cpp @@ -76,7 +76,14 @@ const vector 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 diff --git a/src/search.cpp b/src/search.cpp index 6b12e3fe..610991f4 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -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); diff --git a/src/thread.cpp b/src/thread.cpp index b38bdd6e..2923c07f 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -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. -- 2.39.2