This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[Patch] Fix a latent bug in basic_stringbuf::seekpos
- From: Paolo Carlini <pcarlini at unitus dot it>
- To: libstdc++ at gcc dot gnu dot org
- Cc: Benjamin Kosnik <bkoz at redhat dot com>
- Date: Sat, 31 May 2003 01:00:52 +0200
- Subject: [Patch] Fix a latent bug in basic_stringbuf::seekpos
Hi,
this is not so easy to trigger, since seekoff is ok
and 27.7.1.3,14 undefined behaviour when sp doesn't
come from a previous seekoff or seekpos stands in
the way. Anyway...
Tested x86-linux. Ok with you?
Paolo.
///////
2003-05-30 Paolo Carlini <pcarlini@unitus.it>
* include/bits/sstream.tcc (seekpos): Test against _M_out_lim
not _M_out_end, since the former actually points to the string
end (vs buffer end).
* testsuite/27_io/basic_stringbuf/seekpos/char/3.cc: New.
diff -urN libstdc++-v3-1/include/bits/sstream.tcc libstdc++-v3/include/bits/sstream.tcc
--- libstdc++-v3-1/include/bits/sstream.tcc 2003-05-31 00:49:54.000000000 +0200
+++ libstdc++-v3/include/bits/sstream.tcc 2003-05-30 22:20:42.000000000 +0200
@@ -194,7 +194,7 @@
if (__testout)
{
__beg = this->_M_out_beg;
- __end = this->_M_out_end;
+ __end = this->_M_out_lim;
if (0 <= __pos && __pos <= __end - __beg)
__testposo = true;
}
diff -urN libstdc++-v3-1/testsuite/27_io/basic_stringbuf/seekpos/char/3.cc libstdc++-v3/testsuite/27_io/basic_stringbuf/seekpos/char/3.cc
--- libstdc++-v3-1/testsuite/27_io/basic_stringbuf/seekpos/char/3.cc 1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/27_io/basic_stringbuf/seekpos/char/3.cc 2003-05-31 00:33:35.000000000 +0200
@@ -0,0 +1,47 @@
+// 2003-05-30 Paolo Carlini <pcarlini@unitus.it>
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+#include <sstream>
+#include <testsuite_hooks.h>
+
+void test01()
+{
+ bool test = true;
+ using namespace std;
+ typedef stringbuf::pos_type pos_type;
+ typedef stringbuf::off_type off_type;
+
+ stringbuf strb_01(ios_base::out);
+
+ strb_01.sputn("broken peak", 11);
+ pos_type pt_1 = strb_01.pubseekoff(0, ios_base::end, ios_base::out);
+ // In general, according to 27.7.1.3,14, the below has undefined
+ // behaviour since pt_1 + off_type(1) doesn't come from a
+ // previous pubseekpos or pubseekoff. However, given v3 implementation,
+ // this was useful to expose a bug in pubseekpos checks.
+ pos_type pt_2 = strb_01.pubseekpos(pt_1 + off_type(1), ios_base::out);
+ VERIFY( pt_2 == pos_type(off_type(-1)) );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}