Skip to content

Prettyfier uses undefined behaviour to sequence writes #354

@Dwergi

Description

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions