Skip to content

Commit

Permalink
Fix a subtle bug in UCI options printing
Browse files Browse the repository at this point in the history
We want all the UCI options are printed in the order in which are
assigned, so we use an index that, depending on Options.size(),
increases after each option is added to the map. The problem is
that, for instance, in the first assignment:

o["Write Debug Log"] = Option(false, on_logger);

Options.size() can value 0 or 1 according if the l-value (that
increments the size) has been evaluated after or before the
r-value (that uses the size value).

The culprit is that assignment operator in C++ is not a
sequence point:

http://en.wikipedia.org/wiki/Sequence_point

(Note: to be nitpick here we actually use std::map::operator=()
 that being a function can evaluate its arguments in any order)

So there is no guarantee on what term is evaluated first and
behavior is undefined by standard in this case. The net result
is that in case r-value is evaluated after l-value the last
idx is not size() - 1, but size() and in the printing loop
we miss the last option!

Bug was there since ages but only recently has been exposed by
the removal of UCI_Analyze option so that the last one becomes
UCI_Chess960 and when it is missing engine cannot play anymore
Chess960.

The fix is trivial (although a bit hacky): just increase the
last loop index.

Reported by Eric Mullins that found it on an ARM and MIPS
platforms with gcc 4.7

No functional change.
  • Loading branch information
mcostalba committed Mar 22, 2014
1 parent c714b90 commit 4eee603
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion src/ucioption.cpp
Expand Up @@ -92,7 +92,7 @@ void init(OptionsMap& o) {

std::ostream& operator<<(std::ostream& os, const OptionsMap& om) {

for (size_t idx = 0; idx < om.size(); ++idx)
for (size_t idx = 0; idx < om.size() + 1; ++idx) // idx could start from 1
for (OptionsMap::const_iterator it = om.begin(); it != om.end(); ++it)
if (it->second.idx == idx)
{
Expand Down

0 comments on commit 4eee603

Please sign in to comment.