You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@stdcxx.apache.org by "Farid Zaripov (JIRA)" <ji...@apache.org> on 2008/02/22 18:43:19 UTC

[jira] Resolved: (STDCXX-438) std::string::append (InputIterator, InputIterator) appending self incorrect

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

Farid Zaripov resolved STDCXX-438.
----------------------------------

    Resolution: Fixed

Fixed in STDCXX-170.

Will be closed after adding the regression test for the issue.

> std::string::append (InputIterator, InputIterator) appending self incorrect
> ---------------------------------------------------------------------------
>
>                 Key: STDCXX-438
>                 URL: https://issues.apache.org/jira/browse/STDCXX-438
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 21. Strings
>    Affects Versions: 4.1.2, 4.1.3, 4.1.4, 4.2.0
>         Environment: all
>            Reporter: Martin Sebor
>            Assignee: Farid Zaripov
>            Priority: Minor
>             Fix For: 4.2.1
>
>   Original Estimate: 8h
>  Remaining Estimate: 8h
>
> The 21.string.append.cpp test has been failing a number of assertions for self-referential test cases that exercise the ability to append a substring of a string into itself using the append(InputIterator, InputIterator) member template specialization for InputIterator being an actual Input Iterator. The program below reproduces the problem in a small isolated test case.
> $ cat t.cpp && gmake t && ./t
> #include <cassert>
> #include <cstdlib>
> #include <cstring>
> #include <iterator>
> #include <new>
> #include <string>
> void* operator new (std::size_t n) throw (std::bad_alloc)
> {
>     void* const ptr = std::malloc (n + sizeof n);
>     std::memset (ptr, -1, n);
>     *(std::size_t*)ptr = n;
>     return (std::size_t*)ptr + 1;
> }
> void operator delete (void *ptr) throw ()
> {
>     std::memset (ptr, -1, *((std::size_t*)ptr - 1));
>     std::free ((std::size_t*)ptr - 1);
>     
> }
> struct InputIterator: std::iterator<std::input_iterator_tag, char>
> {
>     const char *p_;
>     InputIterator (const char *p): p_ (p) { }
>     char operator* () const { return *p_; }
>     InputIterator& operator++ () { return ++p_, *this; }
>     InputIterator operator++ (int) {
>         return ++p_, InputIterator (p_ - 1);
>     }
>     bool operator== (const InputIterator &rhs) const { return p_ == rhs.p_; }
> };
> int main ()
> {
>     const char s[] = "abc";
>     {
>         std::string str (s);
>         const char* p0 = s + 1;
>         const char* p1 = p0 + 1;
>         const InputIterator first (p0);
>         const InputIterator last (p1);
>         str.append (first, last);
>         assert ("abcb" == str);
>     }
>     {
>         std::string str (s);
>         const char* p0 = str.data () + 1;
>         const char* p1 = p0 + 1;
>         const InputIterator first (p0);
>         const InputIterator last (p1);
>         str.append (first, last);
>         assert ("abcb" == str);
>     }
> }
> aCC -c -I/amd/devco/sebor/stdcxx/include/ansi -I/usr/include  -D_RWSTDDEBUG   -mt -D_RWSTD_USE_CONFIG -I/amd/devco/sebor/stdcxx/include -I/build/sebor/stdcxx-aCC-3.73-15D/include -I/amd/devco/sebor/stdcxx/tests/include  -Aa +nostl  -g +d  +DD64 +w +W392 +W655 +W684 +W818 +W819 +W849   t.cpp
> aCC t.o -o t -L/build/sebor/stdcxx-aCC-3.73-15D/rwtest -lrwtest15D -Aa +nostl -Wl,+s -Wl,+vnocompatwarnings   -mt +DD64 -L/build/sebor/stdcxx-aCC-3.73-15D/lib  -Wl,+b/build/sebor/stdcxx-aCC-3.73-15D/lib:/build/sebor/stdcxx-aCC-3.73-15D/rwtest -lstd15D  -lm 
> Assertion failed: "abcb" == str, file t.cpp, line 67
> ABORT instruction (core dumped)

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