std::basic_streambuf<>::xsputn() incorrectly inserts the data, that is the part 
of the internal buffer
------------------------------------------------------------------------------------------------------

                 Key: STDCXX-576
                 URL: https://issues.apache.org/jira/browse/STDCXX-576
             Project: C++ Standard Library
          Issue Type: Bug
          Components: 27. Input/Output
    Affects Versions: trunk
         Environment: All
            Reporter: Farid Zaripov
            Assignee: Farid Zaripov
             Fix For: 4.2


The test below aborts on assert. 

test.cpp:
------------------ 
#include <sstream>  // for stringbuf
#include <string>   // for string
#include <cassert>  // for assert()

struct PubBuf: std::stringbuf
{
    char* Pbase () const { return this->pbase (); }
};

int main ()
{
    // 512 is the default buffer size of the basic_stringbuf
    std::string s (512, 'a');

    std::stringbuf sbuf (s);
    PubBuf& buf = (PubBuf&)sbuf;

    std::streamsize res = buf.sputn (buf.Pbase (), 128);
    s.append (s.begin (), s.begin () + 128);

    const std::string& str = buf.str ();

    assert (res == 128);
    assert (str.size () == s.size ());
    assert (str == s);

    return 0;
} 
------------------ 

The test output:
------------------
test: test.cpp:25: int main (): Assertion `str == s' failed.
Aborted
------------------


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to