From a9abb35c9c8ae5d8dab2028a754ae4bbe773391d Mon Sep 17 00:00:00 2001 From: lucasart Date: Tue, 26 Apr 2016 18:39:30 +0800 Subject: [PATCH] Constructed objects must be destructible Pointer members of WDLEntry and DTZEntry must be null, so they can be freed. Whether unmap() behaves like free() and tolerates a NULL pointer (treated as no-op) is unclear. Better safe than sorry, so test data before calling unmap(). Simplify hasUniquePieces calculation while at it. No functional change. --- src/syzygy/tbprobe.cpp | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/syzygy/tbprobe.cpp b/src/syzygy/tbprobe.cpp index 31194e99..172d404a 100644 --- a/src/syzygy/tbprobe.cpp +++ b/src/syzygy/tbprobe.cpp @@ -481,7 +481,6 @@ WDLEntry::WDLEntry(const Position& pos, Key keys[]) memset(this, 0, sizeof(WDLEntry)); key = keys[WHITE]; - ready = 0; num = pos.count(WHITE) + pos.count(BLACK); symmetric = (keys[WHITE] == keys[BLACK]); has_pawns = pos.count(WHITE) + pos.count(BLACK); @@ -494,26 +493,17 @@ WDLEntry::WDLEntry(const Position& pos, Key keys[]) pawn.pawns[0] = pos.count(c ? WHITE : BLACK); pawn.pawns[1] = pos.count(c ? BLACK : WHITE); - } else { - int uniquePieces = 0; - - for (PieceType pt = PAWN; pt <= KING; ++pt) - uniquePieces += (popcount(pos.pieces(WHITE, pt)) == 1) - + (popcount(pos.pieces(BLACK, pt)) == 1); - - if (uniquePieces >= 3) - piece.hasUniquePieces = 1; - else { - // No unique pieces, other than W_KING and B_KING - assert(uniquePieces == 2); - piece.hasUniquePieces = 0; - } - } + } else + for (Color c = WHITE; c <= BLACK; ++c) + for (PieceType pt = PAWN; pt < KING; ++pt) + if (popcount(pos.pieces(c, pt)) == 1) + piece.hasUniquePieces = true; } WDLEntry::~WDLEntry() { - TBFile::unmap(baseAddress, mapping); + if (baseAddress) + TBFile::unmap(baseAddress, mapping); if (has_pawns) for (File f = FILE_A; f <= FILE_D; ++f) { @@ -546,7 +536,8 @@ DTZEntry::DTZEntry(WDLEntry* wdl, Key k[]) DTZEntry::~DTZEntry() { - TBFile::unmap(baseAddress, mapping); + if (baseAddress) + TBFile::unmap(baseAddress, mapping); if (has_pawns) for (File f = FILE_A; f <= FILE_D; ++f)