Fix a subtle bug due to the StateInfo pointer became stale
authorMarco Costalba <mcostalba@gmail.com>
Mon, 23 Feb 2009 17:46:33 +0000 (18:46 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Mon, 23 Feb 2009 20:45:12 +0000 (21:45 +0100)
There was one occurence when the StateInfo variable went
out of scope before the corresponding Position object.

This yelds to a crash. Bug was not hit before because occurs
only when using an UCI interface and not the usual benchmark.

The fix consists in copying internally the content of the
about to stale StateInfo.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/position.cpp
src/position.h
src/uci.cpp

index 0a275b5ee3bdc4e7dfb48fe3b8e8d2f835cced48..7725b934e1eb34824789ae7cbdeaf54078ab53fb 100644 (file)
@@ -1662,6 +1662,18 @@ int Position::see(Square from, Square to) const {
 }
 
 
+/// Position::setStartState() copies the content of the argument
+/// inside startState and makes st point to it. This is needed
+/// when the st pointee could become stale, as example because
+/// the caller is about to going out of scope.
+
+void Position::setStartState(const StateInfo& s) {
+
+  startState = s;
+  st = &startState;
+}
+
+
 /// Position::clear() erases the position object to a pristine state, with an
 /// empty board, white to move, and no castling rights.
 
index ae750697aa894b423fa52e15f5fb4a7d8f93f0eb..676f68ef06136a9ec9ee2cecd55396cd84ea300a 100644 (file)
@@ -240,6 +240,7 @@ public:
   bool square_is_weak(Square s, Color c) const;
 
   // Doing and undoing moves
+  void setStartState(const StateInfo& st);
   void do_move(Move m, StateInfo& st);
   void undo_move(Move m);
   void do_null_move(StateInfo& st);
index b03752edc4220e865d4087642e1523e53050d42a..6ce3bf8567447fa531861af74ff25fe989ccb284 100644 (file)
@@ -22,6 +22,7 @@
 //// Includes
 ////
 
+#include <cassert>
 #include <iostream>
 #include <sstream>
 #include <string>
@@ -228,6 +229,9 @@ namespace {
                 if (RootPosition.rule_50_counter() == 0)
                     RootPosition.reset_game_ply();
             }
+            // Our StateInfo st is about going out of scope,
+            // so save its content before they disappear.
+            RootPosition.setStartState(st);
         }
     }
   }
@@ -321,6 +325,8 @@ namespace {
     if (moveTime)
         infinite = true;  // HACK
 
+    assert(RootPosition.is_ok());
+
     think(RootPosition, infinite, ponder, RootPosition.side_to_move(), time,
           inc, movesToGo, depth, nodes, moveTime, searchMoves);
   }