stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Farid Zaripov (JIRA)" <j...@apache.org>
Subject [jira] Created: (STDCXX-331) std::list::insert() method do not satisfy strong exception safety requirements
Date Thu, 01 Feb 2007 10:30:05 GMT
std::list::insert() method do not satisfy strong exception safety requirements
------------------------------------------------------------------------------

                 Key: STDCXX-331
                 URL: https://issues.apache.org/jira/browse/STDCXX-331
             Project: C++ Standard Library
          Issue Type: Bug
          Components: 23. Containers
    Affects Versions: 4.1.3
         Environment: All
            Reporter: Farid Zaripov


The list::insert() method do not satisfy strong exception safety requirements (23.2.3.3 Remark
1).

Details are here:
http://mail-archives.apache.org/mod_mbox/incubator-stdcxx-dev/200701.mbox/%3c45C0C705.8040606@kyiv.vdiweb.com%3e

test.cpp:
------------------------------
#include <list>
#include <cassert>

static int throw_inx = -1;

class ListItem
{
public:
    static int count_;

    void test ()
    {
        if (throw_inx == count_)
            throw count_;

        ++count_;
    }

    ListItem () { test (); }

    ListItem (const ListItem&) { test (); }

    ~ListItem () { --count_; }
};

int ListItem::count_ = 0;

int main (int argc, char* argv[])
{
    typedef std::list<ListItem> List;
    ListItem items [20];
    List lst (1);

    bool thrown = false;
    throw_inx = 10;

    List::iterator it = lst.begin ();
    ListItem & ref = *it;

    try {
        ListItem::count_ = 0;
        lst.insert (it, 20, items [0]);
    } catch (...) {
        thrown = true;
    }

    assert (thrown);
    assert (it == lst.begin ());
    assert (&ref == &*lst.begin ());
    assert (1 == lst.size ());
    assert (0 == ListItem::count_);

    try {
        ListItem::count_ = 0;
        lst.insert (it, items, items + 20);
    } catch (...) {
        thrown = true;
    }

    assert (thrown);
    assert (it == lst.begin ());
    assert (&ref == &*lst.begin ());
    assert (1 == lst.size ());
    assert (0 == ListItem::count_);

    return 0;
}

The test output:
------------------------------
test: /usr/src/tests/test.cpp:48: int main(int, char**): Assertion `it == lst.begin ()' failed.
Aborted.


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


Mime
View raw message