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 );
}