Uploaded image for project: 'C++ Standard Library'
  1. C++ Standard Library
  2. STDCXX-690

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

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Open
    • Priority: Minor
    • Resolution: Unresolved
    • Affects Version/s: 4.1.2, 4.1.3, 4.1.4, 4.2.0, 4.2.1
    • Fix Version/s: 4.3.0
    • Component/s: 24. Iterators
    • Labels:
      None
    • Severity:
      Incorrect Behavior

      Description

      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

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              sebor Martin Sebor
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:

                Time Tracking

                Estimated:
                Original Estimate - 8h
                8h
                Remaining:
                Remaining Estimate - 8h
                8h
                Logged:
                Time Spent - Not Specified
                Not Specified