-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Description
Describe the bug
Currently, MSVC STL's basic_stringbuf relies on that the eback() pointer points to the beginning of the allocated buffer.
Lines 495 to 497 in e077eb6
| _Al.deallocate(_Ptr_traits::pointer_to(*_Mysb::eback()), | |
| static_cast<typename allocator_traits<allocator_type>::size_type>( | |
| (_Mysb::pptr() ? _Mysb::epptr() : _Mysb::egptr()) - _Mysb::eback())); |
Likewise, basic_syncbuf requires pbase() to behave the same way.
Line 247 in e077eb6
| _Getal().deallocate(_Refancy<_Pointer>(streambuf_type::pbase()), _Buf_size); |
However, the pointers returned by these functions can be modified by users via setg/setp functions, which means these conditions can't be considered as invariants maintained by the implementation.
Command-line test case
STL/tests/libcxx/expected_results.txt
Lines 1103 to 1107 in e077eb6
| # Not analyzed. Assertion failed: _CrtIsValidHeapPointer(block) | |
| std/input.output/string.streams/stringbuf/stringbuf.members/str.pass.cpp FAIL | |
| std/input.output/string.streams/stringbuf/stringbuf.members/view.pass.cpp FAIL | |
| std/input.output/syncstream/syncbuf/syncstream.syncbuf.cons/dtor.pass.cpp FAIL | |
| std/input.output/syncstream/syncbuf/syncstream.syncbuf.members/emit.pass.cpp FAIL |
Expected behavior
These tests pass.
STL version
(Probably in all versions where basic_stringbuf or basic_syncbuf is available.)
Additional context
Not sure whether this can be fixed without breaking ABI. #4239 may be related, but doesn't fix any part of this issue.