tqdm.cpp icon indicating copy to clipboard operation
tqdm.cpp copied to clipboard

Static initialization order fiasco in utils.h

Open PeterZhizhin opened this issue 4 years ago • 0 comments

There are two global variables in utils.h that cause a static initialization order fiasco: all_sinks and standard_sink. The Sink class uses all_sinks in a constructor:

explicit Sink(SinkOptions o) : opts(o) { all_sinks.append(this); }

There is a global variable called standard_sink created as standard_sink(SinkOptions(STDERR_FILENO)).

As per C++ standard, the order of static variables initialization is undefined. Which means that standard_sink may be created before all_sinks is initialized. See https://isocpp.org/wiki/faq/ctors#static-init-order for more information.

PeterZhizhin avatar Jul 07 '20 13:07 PeterZhizhin