Skip to content

Commit

Permalink
Fix undefined behavior in search.
Browse files Browse the repository at this point in the history
We use following line to clamp the search depth in some range:
Depth d = std::clamp(newDepth - r, 1, newDepth + 1);

Through negative extension its possible that the maximum value becomes smaller than the minimum value but then the behavior is undefined (see https://en.cppreference.com/w/cpp/algorithm/clamp). So replace this line with a safe implementation.

Remark:
We have in recent master already one line where up to 3 negative extensions are possible which could trigger this undefined behavior but this can only be happen for completed depth > 24 so its not discovered by our default bench. Recent negative extension tests by @fauzi shows then this undefined behavior with wrong bench numbers.

closes official-stockfish#4877

No functional change
  • Loading branch information
locutus2 authored and vondele committed Nov 16, 2023
1 parent d892177 commit 7970236
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1178,7 +1178,9 @@ Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, boo
// In general we want to cap the LMR depth search at newDepth, but when
// reduction is negative, we allow this move a limited search extension
// beyond the first move depth. This may lead to hidden double extensions.
Depth d = std::clamp(newDepth - r, 1, newDepth + 1);
// To prevent problems when the max value is less than the min value,
// std::clamp has been replaced by a more robust implementation.
Depth d = std::max(1, std::min(newDepth - r, newDepth + 1));

value = -search<NonPV>(pos, ss + 1, -(alpha + 1), -alpha, d, true);

Expand Down

0 comments on commit 7970236

Please sign in to comment.