Fix a possible crash in excluded search condition
authorMarco Costalba <mcostalba@gmail.com>
Thu, 26 Nov 2009 12:44:48 +0000 (13:44 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Thu, 26 Nov 2009 12:58:55 +0000 (13:58 +0100)
Due to IID we could have a ttMove and not a tte, or,
even if we have a tte they could belong to different
searches so that the depth and type of tte don't
have the same origin of the ttMove.

To fix this we always use tte entry in excluded search
condition and, after an IID, we reprobe the TT table.

No functional change. Apart from possible crash fix.

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

index 0a53225abba9a81c8018edd10765b11c8dca00b9..7eb04308b4c3bbd6c72247a6d920927ffc91b9e5 100644 (file)
@@ -1137,6 +1137,11 @@ namespace {
     {
         search_pv(pos, ss, alpha, beta, depth-2*OnePly, ply, threadID);
         ttMove = ss[ply].pv[ply];
+        tte = TT.retrieve(pos.get_key());
+
+        // Following assert could fail, for instance when we have
+        // moveCount == 0 we return without saving a TT entry.
+        /* assert(tte); */
     }
 
     // Initialize a MovePicker object for the current position, and prepare
@@ -1165,8 +1170,11 @@ namespace {
       // To verify this we do a reduced search on all the other moves but the ttMove,
       // if result is lower then TT value minus a margin then we assume ttMove is the
       // only one playable. It is a kind of relaxed single reply extension.
+      // Note that could be ttMove != tte->move() due to IID, so we always use tte->move()
+      // to avoid aliases when we probe tte->depth() and tte->type()
       if (   depth >= 8 * OnePly
-          && move == ttMove
+          && tte
+          && move == tte->move()
           && ext < OnePly
           && is_lower_bound(tte->type())
           && tte->depth() >= depth - 3 * OnePly)
@@ -1430,6 +1438,7 @@ namespace {
     {
         search(pos, ss, beta, Min(depth/2, depth-2*OnePly), ply, false, threadID);
         ttMove = ss[ply].pv[ply];
+        tte = TT.retrieve(pos.get_key());
     }
 
     // Initialize a MovePicker object for the current position, and prepare
@@ -1467,9 +1476,12 @@ namespace {
       // To verify this we do a reduced search on all the other moves but the ttMove,
       // if result is lower then TT value minus a margin then we assume ttMove is the
       // only one playable. It is a kind of relaxed single reply extension.
+      // Note that could be ttMove != tte->move() due to IID, so we always use tte->move()
+      // to avoid aliases when we probe tte->depth() and tte->type()
       if (   depth >= 8 * OnePly
-          && !excludedMove // do not allow recursive single-reply search
-          && move == ttMove
+          && tte
+          && move == tte->move()
+          && !excludedMove // Do not allow recursive single-reply search
           && ext < OnePly
           && is_lower_bound(tte->type())
           && tte->depth() >= depth - 3 * OnePly)