You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@stdcxx.apache.org by "Farid Zaripov (JIRA)" <ji...@apache.org> on 2007/08/09 16:37:42 UTC

[jira] Updated: (STDCXX-514) basic_stringbuf<>::str() deallocating external buffer

     [ https://issues.apache.org/jira/browse/STDCXX-514?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Farid Zaripov updated STDCXX-514:
---------------------------------

    Description: 
The program below aborts due to deallocating the external buffer extbuf.

test.cpp:
------------------
#include <sstream>  // for stringbuf
#include <memory>   // for allocator

#include <cassert>  // for assert()

char extbuf [3];

struct MyAlloc : std::allocator <char>
{
    pointer allocate (size_type __n, std::allocator<void>::const_pointer = 0) {
        return new char [__n];
    }

    void deallocate (pointer __p, size_type)
    {
        assert (extbuf != __p);
        delete [] __p;
    }
};

int main ()
{
    std::basic_stringbuf <char, std::char_traits <char>, MyAlloc> sbuf;

    sbuf.pubsetbuf (extbuf, sizeof (extbuf));

    const char* str = "abcdef";
    sbuf.str (str);
    assert (sbuf.str () == str);

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

The test output:
------------------
test: test.cpp:16: void MyAlloc::deallocate(char*, unsigned int): Assertion `extbuf != __p' failed.
Aborted
------------------


  was:
The program below aborts due to deallocating the external buffer extbuf.

test.cpp:
------------------
#include <sstream>  // for stringbuf
#include <memory>   // for allocator

#include <cassert>  // for assert()

struct MyAlloc : std::allocator <char>
{
    static char      __buf [512];
    static size_type __used_n;

    pointer allocate (size_type __n, std::allocator<void>::const_pointer = 0) {
        assert (!__used_n);
	assert (sizeof (__buf) >= __n * sizeof (value_type));
        __used_n = __n;
        return __buf;
    }

    void deallocate (pointer __p, size_type __n)
    {
        if (__p) {
            assert (__buf == __p);
            assert (__used_n == __n);
	    __used_n = 0;
        }
    }
};

MyAlloc::size_type MyAlloc::__used_n = 0;
char MyAlloc::__buf [512];

int main ()
{
    char extbuf [3];
    std::basic_stringbuf <char, std::char_traits <char>, MyAlloc> sbuf;

    sbuf.pubsetbuf (extbuf, sizeof (extbuf));
    
    // stdcxx extension used: basic_stringbuf::str (const char*, size_t)
    sbuf.str ("abcdef", 6);

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

The test output:
------------------
test: test.cpp:21: void MyAlloc::deallocate(char*, unsigned int): Assertion `__buf == __p' failed.
Aborted
------------------



Simplified test case.

> basic_stringbuf<>::str() deallocating external buffer
> -----------------------------------------------------
>
>                 Key: STDCXX-514
>                 URL: https://issues.apache.org/jira/browse/STDCXX-514
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 27. Input/Output
>    Affects Versions: 4.1.3
>         Environment: All
>            Reporter: Farid Zaripov
>            Assignee: Farid Zaripov
>             Fix For: 4.2
>
>
> The program below aborts due to deallocating the external buffer extbuf.
> test.cpp:
> ------------------
> #include <sstream>  // for stringbuf
> #include <memory>   // for allocator
> #include <cassert>  // for assert()
> char extbuf [3];
> struct MyAlloc : std::allocator <char>
> {
>     pointer allocate (size_type __n, std::allocator<void>::const_pointer = 0) {
>         return new char [__n];
>     }
>     void deallocate (pointer __p, size_type)
>     {
>         assert (extbuf != __p);
>         delete [] __p;
>     }
> };
> int main ()
> {
>     std::basic_stringbuf <char, std::char_traits <char>, MyAlloc> sbuf;
>     sbuf.pubsetbuf (extbuf, sizeof (extbuf));
>     const char* str = "abcdef";
>     sbuf.str (str);
>     assert (sbuf.str () == str);
>     return 0;
> }
> ------------------
> The test output:
> ------------------
> test: test.cpp:16: void MyAlloc::deallocate(char*, unsigned int): Assertion `extbuf != __p' failed.
> Aborted
> ------------------

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