Issue Details (XML | Word | Printable)

Key: STDCXX-690
Type: Bug Bug
Status: Open Open
Priority: Minor Minor
Assignee: Unassigned
Reporter: Martin Sebor
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
C++ Standard Library

[LWG #198] std::reverse_iterator::operator*() invalidates cached values

Created: 08/Jan/08 09:24 PM   Updated: 20/May/08 06:45 PM
Return to search
Component/s: 24. Iterators
Affects Version/s: 4.1.2, 4.1.3, 4.1.4, 4.2.0, 4.2.1
Fix Version/s: 4.3.0

Time Tracking:
Original Estimate: 8h
Original Estimate - 8h
Remaining Estimate: 8h
Remaining Estimate - 8h
Time Spent: Not Specified
Remaining Estimate - 8h

Severity: Incorrect Behavior


 Description  « Hide
According to LWG issue 198 (http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198), the implementation of reverse_iterator::operator*() should cache the "base" iterator to prevent dangling references to values cached by it. The test case below demonstrates the problem caused by not doing so:

$ cat t.cpp && make t && ./t
#include <cassert>
#include <iterator>

struct Iterator: std::iterator<std::random_access_iterator_tag, int>
{
int *cur;
int cache;

Iterator (int *p = 0): cur (p) { }
~Iterator () { cache = ~cache; }

reference operator*() { return cache; }

Iterator& operator++() { cache = *++cur; return *this; }
Iterator& operator--() { cache = *--cur; return *this; }
};

int main ()
{
int a[] = { 1, 2, 3 };
Iterator it (a + sizeof a / sizeof *a);
std::reverse_iterator<Iterator> rit (it);

const int &ref = *rit;
const int val = ref;

++rit;
assert (val == ref);
}
gcc -c -I/home/sebor/stdcxx/include/ansi -D_RWSTDDEBUG -pthread -I/home/sebor/stdcxx/include -I/build/sebor/stdcxx-gcc-4.1.2-15D/include -I/home/sebor/stdcxx/examples/include -pedantic -nostdinc++ -g -W -Wall -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long -Wcast-align t.cpp
gcc t.o -o t -pthread -L/build/sebor/stdcxx-gcc-4.1.2-15D/lib -Wl,-R/build/sebor/stdcxx-gcc-4.1.2-15D/lib -lstd15D -lsupc++ -lm
t: t.cpp:29: int main(): Assertion `val == ref' failed.
Aborted



 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Martin Sebor made changes - 08/Jan/08 09:26 PM
Field Original Value New Value
Priority Major [ 3 ] Minor [ 4 ]
Martin Sebor made changes - 20/May/08 06:45 PM
Affects Version/s 4.2.1 [ 12312690 ]
Fix Version/s 4.3 [ 12312692 ]
Remaining Estimate 8h [ 28800 ]
Original Estimate 8h [ 28800 ]