From 687e00ee8a88d034fb91a9eecb611b5927c5f677 Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Fri, 9 Feb 2007 01:00:25 +0000 Subject: [PATCH] re PR libstdc++/17012 ([DR 526] std::list's function, remove, looks like it is reading memory that has been freed.) 2007-02-08 Howard Hinnant PR libstdc++/17012 * include/bits/list.tcc (list<>::remove): Take care of &*__first == &__value. * docs/html/ext/howto.html: Add an entry for DR 526. From-SVN: r121735 --- libstdc++-v3/ChangeLog | 7 +++++++ libstdc++-v3/docs/html/ext/howto.html | 7 +++++++ libstdc++-v3/include/bits/list.tcc | 15 +++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1610a6079eb..1effedd5fd0 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2007-02-08 Howard Hinnant + + PR libstdc++/17012 + * include/bits/list.tcc (list<>::remove): Take care of + &*__first == &__value. + * docs/html/ext/howto.html: Add an entry for DR 526. + 2007-02-07 Jakub Jelinek PR libgomp/28468 diff --git a/libstdc++-v3/docs/html/ext/howto.html b/libstdc++-v3/docs/html/ext/howto.html index 951e108dacd..c3dcca4d213 100644 --- a/libstdc++-v3/docs/html/ext/howto.html +++ b/libstdc++-v3/docs/html/ext/howto.html @@ -586,6 +586,13 @@
Construct a linear_congruential engine and seed with it.
+
526: + Is it undefined if a function in the standard changes in + parameters? +
+
Use &value. +
+
538: 241 again: Does unique_copy() require CopyConstructible and Assignable? diff --git a/libstdc++-v3/include/bits/list.tcc b/libstdc++-v3/include/bits/list.tcc index f2849fb6e52..6bde3b77d00 100644 --- a/libstdc++-v3/include/bits/list.tcc +++ b/libstdc++-v3/include/bits/list.tcc @@ -1,6 +1,6 @@ // List implementation (out of line) -*- C++ -*- -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -176,14 +176,25 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD) { iterator __first = begin(); iterator __last = end(); + iterator __extra = __last; while (__first != __last) { iterator __next = __first; ++__next; if (*__first == __value) - _M_erase(__first); + { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 526. Is it undefined if a function in the standard changes + // in parameters? + if (&*__first != &__value) + _M_erase(__first); + else + __extra = __first; + } __first = __next; } + if (__extra != __last) + _M_erase(__extra); } template