[PING][PATCH][RFC] vterminate use of malloc-less demangler
Simon Baldwin
simonb@google.com
Fri Mar 16 18:09:00 GMT 2007
Any movement or further thoughts on this patch?
Thanks.
Simon Baldwin wrote:
> Benjamin Kosnik wrote:
>
>>
>>> Testing this work is, unfortunately, rather tricky. I do have a
>>> simple test case, appended below, that allows me to confirm manually
>>> that __verbose_terminate_handler is operating without heap use.
>>>
>>> This test, however, is hard to fit into any test framework. First,
>>> it aborts whether or not it's successful; that's the nature of
>>> changing termination code. Second, it relies on MALLOC_CHECK_,
>>> making it Linux only and not portable. And third, it relies on
>>> carnal knowledge of libc's heap organization in order to "lightly"
>>> corrupt the heap without overdoing it.
>>>
>>> Some of these restrictions might be avoidable. For example,
>>> interposing malloc, realloc, free, and calloc catches calls to heap
>>> functions in the same way as MALLOC_CHECK_, so could make the test
>>> slightly more portable. This still isn't fully portable across all
>>> platforms, though, and may require platform-specific link options
>>> even where practical. Likewise, the abort() can be caught with a
>>> SIGABRT handler, but again is not portable. I experimented with a
>>> test based on these ideas, but it's probably too complex to be
>>> reliable.
>>>
>>> There seems to be no identifiable current vterminate.cc test I can
>>> extend for this patch. If you have other ideas for how to add a
>>> suitable test to the libstdc++ test suite, please let me know.
>>
>>
>>
>> I cannot, at the moment, sorry. Also, your test case does not
>> reproduce the issue for me, on FC6.
>>
>> I get:
>>
>> %./a.out
>> malloc: using debugging hooks
>> *** glibc detected *** ./a.out: malloc: top chunk is corrupt:
>> 0x08d40088 ***
>
>
>
> Did you link the test program with a libstdc++ that contains my
> patch? If not, then you have successfully reproduced the issue --
> this is it.
>
> Without the patch, __cxa_demangle(), called from
> __verbose_terminate(), will attempt to allocate memory to hold the
> result of demangling. Because the test program deliberately corrupts
> the heap and sets MALLOC_CHECK_, demangling will then fail to
> allocate, and give an error like that above.
>
> With the patch, and linking the test program to a patched libstdc++.a,
> you'll see
>
> %./a.out
> malloc: using debugging hooks
> terminate called after throwing an instance of 'std::bad_alloc'
> what(): St9bad_alloc
> Aborted
>
> indicating that name demangling and other termination handling still
> function even in the presence of a corrupted and unusable heap.
>
>>>> 2) Are you planning on making this new function available to other
>>>> users besides the verbose terminate handler? If so, the declaration
>>>> should go below cxa_demangle in cxxabi.h and the function should be
>>>> exported. If not, the declaration should be removed.
>>>
>>>
>>>
>>>
>>> The __gcclibcxx_demangle_callback() function is intended as a
>>> private contract between glibc and libstdc++. There's no plan to
>>> use it elsewhere. Callback-based demangling for general use is
>>> provided by cplus_demangle_v3_callback(), supplied by libiberty's
>>> include/demangle.h as an extension to the existing
>>> cplus_demangle_v3(). Moving the declaration of
>>> __gcclibcxx_demangle_callback() to cxxabi.h is also slightly
>>> misleading, as the function isn't actually part of the defined ABI.
>>>
>>> The current declaration can't be removed if not placed in cxxabi.h
>>> -- this would prevent the vterminate.cc from compiling.
>>
>>
>>
>> [snip]
>>
>>> There don't appear to be any other functions that are private
>>> contracts between glibc and libstdc++, so this name seems
>>> reasonable. In particular, it's not part of the C++ ABI, so naming
>>> it __cxa_... was deemed unacceptable. (In practice, it's actually a
>>> variant of __cxa_demangle(), but has to have a different name as the
>>> specification of __cxa_demangle() doesn't permit malloc-less
>>> operation).
>>
>>
>>
>> I think you should re-evaluate your approach with this patch. I think
>> this malloc-free demangler addition should be obvious to people using
>> the cxxabi.h interfaces.
>>
>> In overview, libiberty and libsupc++/libstdc++ share the demangler
>> code. However, libstdc++ has an API-defined interface to the
>> demangler, in __cxa_demangle from cxxabi.h. You're augmenting this,
>> much like other non-ABI extensions (__cxa_cdtor_return_type,
>> __cxa_cdtor_type), and admittedly so from your last parenthetical bit
>> above.
>>
>> And, I think this is a good thing: clearly, there are issues with
>> __cxa_demangle's memory management facilities. There's even been
>> previous attempts to deal with this in libsupc++, with this. See
>> gcc-3.4.0's struct demangle in libstdc++-v3/ext/demangle.h etc etc.
>>
>> I'm of the opinion that something like __cxa_demangle_no_alloc, ie
>> something much simpler and direct, without all the callback goo,
>> would be a much cleaner route to get where you want to go. Then, you
>> could use this no-alloc routine in __verbose_terminate_handler. Or,
>> __cxa_demangle_callback if you can convince me that there is ever
>> going to be more than one callback...
>
>
>
> __cxa_demangle_callback() was the original name of this demangler
> function, but this was rejected as part of the review of libiberty
> revision 121305, which changed it to _gcclibcxx_demangle_callback().
> The rationale is that since this function is not part of the ia64 ABI,
> it should not be named as though it is.
>
> Please explain how you envision a demangling interface that explicitly
> avoids both allocations and callbacks. In particular, how should it
> return or otherwise handle the demangled string?
>
>> In addition, I think this addition should be mentioned here:
>> http://gcc.gnu.org/onlinedocs/libstdc++/18_support/howto.html#6
>
>
>
> This is relevant only for functions that are described by cxxabi.h.
> As noted above, this addition isn't, since it's not part of the ABI.
>
> Conventional client code access to allocation-less demangling is
> provided by the libiberty functions cplus_demangle_v3_callback(),
> java_demangle_v3_callback(), and cplus_demangle_print_callback(), all
> analogous to the existing libiberty functions that return allocated
> strings -- cplus_demangle_v3(), java_demangle_v3(), and
> cplus_demangle_print().
>
>
More information about the Libstdc++
mailing list