Dev Builds » 20260710-1817

You are viewing an old NCM Stockfish dev build test. You may find the most recent dev build tests using Stockfish 15 as the baseline here.

Use this dev build

NCM plays each Stockfish dev build 20,000 times against Stockfish 14. This yields an approximate Elo difference and establishes confidence in the strength of the dev builds.

Summary

Host Duration Avg Base NPS Games WLD Standard Elo Ptnml(0-2) Gamepair Elo

Test Detail

ID Host Base NPS Games WLD Standard Elo Ptnml(0-2) Gamepair Elo CLI PGN

Commit

Commit ID 9700f6f206da5102c5dfb2414c5e7e13d844fcbf
Author Miloslav Macůrek
Date 2026-07-10 18:17:23 UTC
Fix crash with UCI_LimitStrength and tablebases at the root `Skill::pick_best()` assumes the root moves are sorted by score in descending order: ```cpp Value topScore = rootMoves[0].score; int delta = std::min(topScore - rootMoves[multiPV - 1].score, int(PawnValue)); ``` That does not have to be so with Syzygy tablebases at the root, where the moves are ordered by `tbRank` instead. `rootMoves[0]` is then not the highest score and `delta` can go negative. Since `delta * (rng.rand<unsigned>() % int(weakness))` is evaluated as unsigned, a negative `delta` wraps to a large value and the `int(...)` cast overflows, so the `score + push >= maxScore` check never passes and `best` stays `Move::none()`. The caller ```cpp std::swap(rootMoves[0], *std::find(rootMoves.begin(), rootMoves.end(), skill.best ? skill.best : skill.pick_best(rootMoves, multiPV))); ``` then dereferences `end()`. The result is a crash, or sometimes `bestmove (none)` / an illegal move, in tablebase endgames when `UCI_LimitStrength` is set (or `Skill Level` is below 20). The fix computes the score range over the candidate moves directly, so `delta` stays non-negative and a valid move is always returned. **To reproduce**: ``` setoption name UCI_LimitStrength value true setoption name UCI_Elo value 2900 setoption name SyzygyPath value <syzygy tablebases path> position fen 8/8/8/4k3/8/8/3BKN2/8 b - - 0 1 go wtime 250 btime 250 winc 100 binc 100 ``` You need to call the go command a couple of times before crash, after which is ends with ``` bestmove a1e5 ponder (none) ``` and on the next `go wtime 250 btime 250 winc 100 binc 100` it crashes printing: ``` info string Available processors: 0-31 info string Using 1 thread info string NNUE evaluation using nn-af1339a6dea3.nnue (106MiB, (83248, 1024, 31, 32, 1)) info string Network replica 1: Shared memory. ``` Bench is unchanged, since this code only runs under `UCI_LimitStrength` / `Skill Level`. closes https://github.com/official-stockfish/Stockfish/pull/6957 No functional change
Copyright 2011–2026 Next Chess Move LLC