[Bug c++/70732] Operator new is unable to throw std::bad_alloc() when memory is exhausted in statically linked executable
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Apr 20 07:51:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70732
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |WAITING
Last reconfirmed| |2016-04-20
Ever confirmed|0 |1
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.
unwind-dw2-fde.c does
static inline int
start_fde_sort (struct fde_accumulator *accu, size_t count)
{
size_t size;
if (! count)
return 0;
size = sizeof (struct fde_vector) + sizeof (const fde *) * count;
if ((accu->linear = malloc (size)))
{
accu->linear->count = 0;
if ((accu->erratic = malloc (size)))
accu->erratic->count = 0;
return 1;
}
else
return 0;
}
via
#0 search_object (ob=ob@entry=0x80fafa4 <object>,
pc=pc@entry=0x80563ee <_Unwind_RaiseException+46>)
at /space/rguenther/src/svn/gcc-5-branch/libgcc/unwind-dw2-fde.c:966
#1 0x08058275 in _Unwind_Find_registered_FDE (bases=0xffdfa7d4,
pc=0x80563ee <_Unwind_RaiseException+46>)
at /space/rguenther/src/svn/gcc-5-branch/libgcc/unwind-dw2-fde.c:1025
#2 _Unwind_Find_FDE (pc=0x80563ee <_Unwind_RaiseException+46>,
bases=0xffdfa7d4)
at /space/rguenther/src/svn/gcc-5-branch/libgcc/unwind-dw2-fde-dip.c:448
#3 0x08054bf3 in uw_frame_state_for (context=context@entry=0xffdfa780,
fs=fs@entry=0xffdfa690)
at /space/rguenther/src/svn/gcc-5-branch/libgcc/unwind-dw2.c:1241
#4 0x08055c76 in uw_init_context_1 (context=context@entry=0xffdfa780,
outer_cfa=outer_cfa@entry=0xffdfa960, outer_ra=
0x804aac4 <__cxxabiv1::__cxa_throw(void*, std::type_info*, void
(*)(void*))+100>) at
/space/rguenther/src/svn/gcc-5-branch/libgcc/unwind-dw2.c:1562
#5 0x080563ef in _Unwind_RaiseException (exc=0x8835d78)
at /space/rguenther/src/svn/gcc-5-branch/libgcc/unwind.inc:88
#6 0x0804aac4 in __cxxabiv1::__cxa_throw (obj=0x8835d98,
tinfo=0x80f9df4 <typeinfo for std::bad_alloc>,
dest=0x80490b0 <std::bad_alloc::~bad_alloc()>)
at
/space/rguenther/src/svn/gcc-5-branch/libstdc++-v3/libsupc++/eh_throw.cc:82
but it's just trying to sort the FDE - if it fails to allocate the memory
required for that (glibc does quite a few mmap calls for that attempt) it
continues w/o sorting the FDE but then eventually properly unwinds and throws.
If I add a printf to print k to show how many times foo is called before
throwing then I see
> ./a.out
9682
9684
9686
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted
for the dynamically linked case and
> ./a.out
14626
14628
14630
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted
for the statically linked case. I think thats a reasonable result and thus
I think there is no bug.
More information about the Gcc-bugs
mailing list