https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89452
Bug ID: 89452 Summary: basic_stringbuf::seekoff and basic_stringbuf::seekpos implementations Product: gcc Version: 7.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: nknikita at niisi dot ras.ru Target Milestone: --- It seems that basic_stringbuf::seekoff and basic_stringbuf::seekpos implementations are inconsistent with the requirements of the standard. As far as I can see, the standard ensures the execution of the following code will not be terminated: std::stringbuf sb("abcdefgh", std::ios_base::in); assert(sb.pubseekpos(3, std::ios_base::in | std::ios_base::out) == -1); According to ISO/IEC 14882:2017(E): 1. basic_streambuf::pubseekpos calls seekpos member function of the most derived class, i.e., basic_stringbuf::seekpos. 2. basic_stringbuf::seekpos (3, std::ios_base::in | std::ios_base::out) effectively calls basic_stringbuf::seekoff (3, std::ios_bas::beg, std::ios_base::in | std::ios_base::out). 3. basic_stringbuf::seekoff identifies what sequences should be positioned. Since std::ios_base::in | std::ios_base::out is passed as which and ios_base::beg is passed as way, both the input and the output sequences should be affected ([stringbuf.virtuals]/9). 4. pptr() is a null pointer. Paragraphs [stringbuf.cons]/3, [streambuf.cons]/1, [stringbuf. members]/3 guarantee it. 5. [stringbuf.virtuals]/10 specifies that the positioning operation fails, i.e., pos_type(-1) should be returned. However, seekoff/seekpos implementations impose some additional requirements while identifying sequences to be positioned: bool __testin = (ios_base::in & this->_M_mode & __mode) != 0; bool __testout = (ios_base::out & this->_M_mode & __mode) != 0; that is, the openmode is also checked. The input/output sequence therefore will not be positioned if stringbuf openmode does not include ios_base::in/ios_base::out. In the example given, the input sequence will be positioned without an error (an unexpected behavior).