Fix a segfault.
authorJoost VandeVondele <Joost.VandeVondele@gmail.com>
Sun, 16 Dec 2018 08:51:29 +0000 (09:51 +0100)
committerStéphane Nicolet <cassio@free.fr>
Sun, 16 Dec 2018 08:53:11 +0000 (09:53 +0100)
commit4e2bb8fa44fe03a2fdb2d3448ac93986354bf9ae
tree4ad6085adbbd35629ce3e7cf2938563f68f24e90
parentfda0161e3a5295a759f04a0e302567a773f82595
Fix a segfault.

this patch fixes a rare but reproducible segfault observed playing a
multi-threaded match, it is discussed somewhat in fishcooking.

From the core file, it could be observed that the issue was in qsearch, namely:

````
   ss->pv[0] = MOVE_NONE;
````

and the backtrace shows the it arrives there via razoring, called from the rootNode:

````
    (gdb) bt
    alpha=-19, beta=682, depth=DEPTH_ZERO) at search.cpp:1247
````

Indeed, ss->pv can indeed by a nullptr at the rootNode. However, why is the
segfault so rare ?

The reason is that the condition that guards razoring:

````
   (depth < 2 * ONE_PLY &&  eval <= alpha - RazorMargin)
````

is almost never true, since at the root alpha for depth < 5 is -VALUE_INFINITE.

Nevertheless with the new failHigh scheme, this is not guaranteed, and rootDepth > 5,
can still result in a depth < 2 search at the rootNode. If now another thread,
via the hash, writes a new low eval to the rootPos qsearch can be entered.
Rare but not unseen... I assume that some of the crashes in fishtest recently
might be due to this.

Closes https://github.com/official-stockfish/Stockfish/pull/1860

No functional change
src/search.cpp