[cfe-dev] libc++ and libc++abi problem with stdexcept on linux
Howard Hinnant
hhinnant at apple.com
Fri Jan 10 10:20:21 PST 2014
It looks like the __libcpp_nmstr from libcxxabi/src/stdexcept.cpp needs to be copied/substituted in to the libcxx/src/stdexcept.cpp. I haven't had a chance to confirm that with full test suite runs.
Howard
On Jan 10, 2014, at 8:03 AM, Alexander Potapenko <glider at google.com> wrote:
> A friendly ping
>
> On Mon, Dec 30, 2013 at 1:13 PM, Alexander Potapenko <glider at google.com> wrote:
>> ASan complains about the memory being allocated with operator new[]
>> for array types (this is probably done in
>> libcxxabi/src/stdexcept.cpp:78:
>>
>> 75 __libcpp_nmstr::__libcpp_nmstr(const char* msg)
>> 76 {
>> 77 std::size_t len = strlen(msg);
>> 78 str_ = static_cast<const char*>(::operator new(len + 1 + offset));
>>
>> ) and deallocated with operator delete for non-array types (at
>> libcxxabi/src/stdexcept.cpp:123:
>>
>> 116 __libcpp_nmstr::~__libcpp_nmstr()
>> 117 {
>> 118 #if __APPLE__
>> 119 if (str_ != get_gcc_empty_string_storage())
>> 120 #endif
>> 121 if (__sync_add_and_fetch(&count(), count_t(-1)) < 0)
>> 122 {
>> 123 ::operator delete(const_cast<char*>(str_ - offset));
>> 124 }
>>
>> )
>>
>> Such a mismatch is explicitly considered UB in the C++11 Standard.
>>
>> Howard, can you please take a look?
>>
>> On Mon, Dec 30, 2013 at 9:21 AM, Ben Pope <benpope81 at gmail.com> wrote:
>>> Hi,
>>>
>>> I've got libc++ linked with libc++abi, but I'm having a problem within
>>> stdexcept, it seems to be mixing up the __libcpp_nmstr from libc++ with
>>> that from libc++abi.
>>>
>>> I built trunk libc++ and libc++abi on Ubuntu 13.10 with:
>>> CC=clang-3.4 CXX=clang++-3.4 cmake -G "Unix Makefiles"
>>> -DLIBCXX_CXX_ABI=libcxxabi
>>> -DLIBCXX_LIBCXXABI_INCLUDE_PATHS="../../libcxxabi/include"
>>> -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr ../
>>>
>>>
>>> The following code reproduces this:
>>>
>>> #include <stdexcept>
>>>
>>> int main()
>>> {
>>> try { throw std::runtime_error("Foo"); }
>>> catch (std::exception const&) {}
>>> }
>>>
>>> clang++-3.4 -fsanitize=address -std=c++11 -stdlib=libc++ -lc++abi
>>> teststdexcept.cpp -o teststdexcept
>>>
>>> And the output of ASan:
>>>
>>> =================================================================
>>> ==12336==ERROR: AddressSanitizer: alloc-dealloc-mismatch (operator new
>>> [] vs operator delete) on 0x60300000efe0
>>> #0 0x466019 in operator delete(void*)
>>> /home/ben/development/llvm/3.4/final/llvm.src/projects/compiler-rt/lib/asan/asan_new_delete.cc:83
>>> #1 0x7f6cbbbca550 in ~__libcpp_nmstr
>>> /home/ben/development/llvm/trunk/libcxxabi/lib/../src/stdexcept.cpp:123
>>> #2 0x7f6cbbbca550 in std::overflow_error::~overflow_error()
>>> /home/ben/development/llvm/trunk/libcxxabi/lib/../src/stdexcept.cpp:150
>>> #3 0x7f6cbbbc6d9d in __cxa_decrement_exception_refcount
>>> /home/ben/development/llvm/trunk/libcxxabi/lib/../src/cxa_exception.cpp:519
>>> #4 0x7f6cbbbc6d9d in __cxa_end_catch
>>> /home/ben/development/llvm/trunk/libcxxabi/lib/../src/cxa_exception.cpp:399
>>> #5 0x47bc1b in main (/home/ben/development/test/teststdexcept+0x47bc1b)
>>> #6 0x7f6cba9d9de4 in __libc_start_main
>>> /build/buildd/eglibc-2.17/csu/libc-start.c:260
>>> #7 0x47b77c in _start
>>> (/home/ben/development/test/teststdexcept+0x47b77c)
>>>
>>> 0x60300000efe0 is located 0 bytes inside of 28-byte region
>>> [0x60300000efe0,0x60300000effc)
>>> allocated by thread T0 here:
>>> #0 0x465dd9 in operator new[](unsigned long)
>>> /home/ben/development/llvm/3.4/final/llvm.src/projects/compiler-rt/lib/asan/asan_new_delete.cc:54
>>> #1 0x7f6cbb02770c in std::runtime_error::runtime_error(char const*)
>>> (/usr/lib/libc++.so.1+0x9170c)
>>> #2 0x7f6cba9d9de4 in __libc_start_main
>>> /build/buildd/eglibc-2.17/csu/libc-start.c:260
>>>
>>>
>>> Any ideas what went wrong?
>>>
>>> Cheers,
>>>
>>> Ben
>>>
>>> _______________________________________________
>>> cfe-dev mailing list
>>> cfe-dev at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>
>>
>>
>> --
>> Alexander Potapenko
>> Software Engineer
>> Google Moscow
>
>
>
> --
> Alexander Potapenko
> Software Engineer
> Google Moscow
More information about the cfe-dev
mailing list