Prettyfier uses undefined behaviour to sequence writes
Created by: Dwergi
The entirety of Prettyfier uses this pattern:
size_t writeBlockClose(uint8_t c) {
return unindentIfNeeded() + _sink.write( c );
}
This makes an assumption that unindentIfNeeded is called first, but this assumption is wrong, because + is not a sequence point. C++ makes no guarantees about evaluation order in this case, and in VS2015, _sink.write is called first.
To guarantee order of evaluation, all of these functions should be split across two lines:
size_t writeBlockClose(uint8_t c) {
size_t written = unindentIfNeeded();
return written + _sink.write( c );
}