[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#185243: libstdc++3-dev: rope segfaults under heavy load



Package: libstdc++3-dev
Version: 1:3.0.4-7
Severity: important

Consider the following program:

--- BEGIN ropetest.c ---
#include <ext/rope>

using namespace std;
using namespace __gnu_cxx;

unsigned int rand(unsigned int max) {
  unsigned int rval = (unsigned int)(((double)max)*rand()/(RAND_MAX));
  if (rval == max)
    return max-1;
}

int main() {
  crope r;
  char buf[10240];
  
  while (1) {
    if (rand(2) && r.size() < 1024*1024) {
      r.append(buf, rand(10240));
    } else if (r.size() > 10240) {
      r.erase(0, rand(10240));
    }
  }
  return 0;
}
--- END ropetest.c ---

It crashes when compiled with g++-3.0 or g++-3.2 (but not on g++ 2.95):

$ g++ ropetest.c -o ropetest-295 -Wall
[ press CTRL-C ]
$ ./ropetest-295
$ g++-3.0 ropetest.c -o ropetest-300 -Wall -g
$ ./ropetest-300
Segmentation fault
$ g++-3.2 ropetest.c -o ropetest-320 -Wall
$ ./ropetest-320
Aborted

$ gdb g++-3.0
GNU gdb 5.3-debian
[ snip ]
(gdb) run
Starting program: ropetest-300

Program received signal SIGSEGV, Segmentation fault.
std::_Refcount_Base::_M_incr() (this=0xef8)
    at /usr/include/g++-v3/bits/stl_threads.h:143
143         ++_M_ref_count;
(gdb) bt
#0  std::_Refcount_Base::_M_incr() (this=0xef8)
    at /usr/include/g++-v3/bits/stl_threads.h:143
#1  0x0804a6b5 in std::_Rope_RopeRep<char, std::allocator<char> >::_M_ref_nonnil() (this=0xef4)
    at /usr/include/g++-v3/ext/stl_rope.h:514
#2  0x0804bf1e in std::_Rope_RopeSubstring<char, std::allocator<char> >::_Rope_RopeSubstring(std::_Rope_RopeRep<char, std::allocator<char> >*, unsigned, unsigned, std::allocator<char>) (this=0x8054828, __b=0xef4, __s=1405, __l=2943, __a=0xbfffcbc0)
    at /usr/include/g++-v3/ext/stl_rope.h:717
#3  0x0804b778 in std::rope<char, std::allocator<char> >::_S_new_RopeSubstring(std::_Rope_RopeRep<char, std::allocator<char> >*, unsigned, unsigned, std::allocator<char>) (__b=0xef4, __s=1405, __l=2943, __a=0xbfffcc30)
    at /usr/include/g++-v3/ext/stl_rope.h:1392
#4  0x0804aa50 in std::rope<char, std::allocator<char> >::_S_substring(std::_Rope_RopeRep<char, std::allocator<char> >*, unsigned, unsigned) (__base=0x80547ec, __start=1405, __endp1=4348)
    at /usr/include/g++-v3/ext/ropeimpl.h:721
#5  0x0804a8b8 in std::rope<char, std::allocator<char> >::_S_substring(std::_Rope_RopeRep<char, std::allocator<char> >*, unsigned, unsigned) (__base=0x8050b68, __start=1405, __endp1=6370)
    at /usr/include/g++-v3/ext/ropeimpl.h:683
#6  0x0804a8b8 in std::rope<char, std::allocator<char> >::_S_substring(std::_Rope_RopeRep<char, std::allocator<char> >*, unsigned, unsigned) (__base=0x8050ad8, __start=1405, __endp1=11258)
    at /usr/include/g++-v3/ext/ropeimpl.h:683
#7  0x0804a8b8 in std::rope<char, std::allocator<char> >::_S_substring(std::_Rope_RopeRep<char, std::allocator<char> >*, unsigned, unsigned) (__base=0x8050b98, __start=1405, __endp1=14993)
    at /usr/include/g++-v3/ext/ropeimpl.h:683
#8  0x0804a8b8 in std::rope<char, std::allocator<char> >::_S_substring(std::_Rope_RopeRep<char, std::allocator<char> >*, unsigned, unsigned) (__base=0x8050bf8, __start=1405, __endp1=24743)
    at /usr/include/g++-v3/ext/ropeimpl.h:683
#9  0x0804a8b8 in std::rope<char, std::allocator<char> >::_S_substring(std::_Rope_RopeRep<char, std::allocator<char> >*, unsigned, unsigned) (__base=0x8050c58, __start=1405, __endp1=31252)
    at /usr/include/g++-v3/ext/ropeimpl.h:683
#10 0x0804a8b8 in std::rope<char, std::allocator<char> >::_S_substring(std::_Rope_RopeRep<char, std::allocator<char> >*, unsigned, unsigned) (__base=0x8050cb8, __start=1405, __endp1=32702)
    at /usr/include/g++-v3/ext/ropeimpl.h:683
#11 0x0804a8b8 in std::rope<char, std::allocator<char> >::_S_substring(std::_Rope_RopeRep<char, std::allocator<char> >*, unsigned, unsigned) (__base=0x8050d18, __start=1405, __endp1=32868)
    at /usr/include/g++-v3/ext/ropeimpl.h:683
#12 0x0804a055 in std::rope<char, std::allocator<char> >::replace(std::_Rope_RopeRep<char, std::allocator<char> >*, unsigned, unsigned, std::_Rope_RopeRep<char, std::allocator<char> >*) (__old=0x8050d18, __pos1=0, __pos2=1405, __r=0x0)
    at /usr/include/g++-v3/ext/stl_rope.h:1846
#13 0x08049d7d in std::rope<char, std::allocator<char> >::erase(unsigned, unsigned) (this=0xbffff9a0, __p=0, __n=1405)
    at /usr/include/g++-v3/ext/stl_rope.h:1993
#14 0x08049b81 in main () at ropetest.cc:21


-- System Information
Debian Release: testing/unstable
Architecture: i386
Kernel: Linux crafter 2.4.19 #1 Fri Sep 27 18:25:53 PDT 2002 i686
Locale: LANG=C, LC_CTYPE=C

Versions of packages libstdc++3-dev depends on:
ii  g++-3.0                       1:3.0.4-7  The GNU C++ compiler.
ii  gcc-3.0-base                  1:3.0.4-7  The GNU Compiler Collection (base 
ii  libc6-dev                     2.3.1-14   GNU C Library: Development Librari
ii  libstdc++3                    1:3.0.4-7  The GNU stdc++ library version 3




Reply to: