[cfe-dev] std::use_facet<std::ctype<char>> crashes on linux

Howard Hinnant hhinnant at apple.com
Mon Aug 19 08:32:37 PDT 2013


On Aug 19, 2013, at 11:10 AM, toki loki <tokiloki7 at gmail.com> wrote:

> Hi,
> 
> Program
> 
> #include <locale>
> int main(int argc, char* argv[]) {
>     std::locale loc;
>     std::use_facet<std::ctype<char>>(loc);
>     return EXIT_SUCCESS;
> }
> 
> Crashes with latest libc++ and libc++abi on Linux with backtrace
> 
> 
> (gdb) bt
> #0  0xb7fff424 in __kernel_vsyscall ()
> #1  0x45abdbaf in raise () from /lib/libc.so.6
> #2  0x45abf503 in abort () from /lib/libc.so.6
> #3  0xb7fbf43c in abort_message (format=0xb7ff8264 "terminating with %s exception of type %s: %s") at ../src/abort_message.cpp:47
> #4  0xb7fbf5f9 in default_terminate_handler () at ../src/cxa_default_handlers.cpp:63
> #5  0xb7ff4f04 in std::__terminate (func=0xb7fbf4e0 <default_terminate_handler()>) at ../src/cxa_handlers.cpp:67
> #6  0xb7ff44e5 in failed_throw (exception_header=<optimized out>) at ../src/cxa_exception.cpp:147
> #7  __cxa_throw (thrown_object=0x804b058, tinfo=0xb7ffce50 <typeinfo for std::bad_cast>, dest=0xb7ff8170 <std::bad_cast::~bad_cast()>) at ../src/cxa_exception.cpp:242
> #8  0xb7f14b82 in std::__1::locale::__imp::use_facet (
>     this=0xb7fb91a0 <std::__1::locale::__imp& std::__1::(anonymous namespace)::make<std::__1::locale::__imp, unsigned int>(unsigned int)::buf>, id=28)
>     at /home/vv/kom/libcxx/src/locale.cpp:432
> #9  0xb7f15486 in std::__1::locale::use_facet (this=0xbfffeca0, x=...) at /home/vv/kom/libcxx/src/locale.cpp:574
> #10 0x0804878e in main (argc=1, argv=0xbfffed54) at main.cpp:4
> 
> 
> I have found that 'std::ctype<char>::id.__get()' is 28 for me. I have constexpr enabled.
> 
> Thanks.
> 

The only way I know to debug this is to monitor locale::id::__init() in locale.cpp.  One needs to find out who is calling it, how often, from where, and what the current value of __next_id is, and what __id_ gets set to.  I do not have a linux box to debug this with.

The design is that this gets called exactly 28 times with a default constructed locale and that id.__get() returns __id_-1:

long
locale::id::__get()
{
    call_once(__flag_, __fake_bind(&locale::id::__init, this));
    return __id_ - 1;
}

Furthermore locale::id::__init() is a private function of locale::id and is supposed to be only called within locale::id::__get().

One theory is:  call_once isn't working.

Howard




More information about the cfe-dev mailing list