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

toki loki tokiloki7 at gmail.com
Mon Aug 19 09:39:34 PDT 2013


I have made mistake about libc++ being compiled with clang++. Issue became
resolved after I used clang for libc++ compilation. Sorry for that.


On Mon, Aug 19, 2013 at 7:36 PM, Howard Hinnant <hhinnant at apple.com> wrote:

> Ok, I've seen this one before:
>
> ------------------------------------------------------------------------
> r160785 | hhinnant | 2012-07-26 12:14:37 -0400 (Thu, 26 Jul 2012) | 1 line
>
> locale::id really needs to be constructed at compile time.
> ------------------------------------------------------------------------
> Index: include/__locale
> ===================================================================
> --- include/__locale    (revision 160784)
> +++ include/__locale    (revision 160785)
> @@ -119,7 +119,7 @@
>
>      static int32_t __next_id;
>  public:
> -    _LIBCPP_INLINE_VISIBILITY id() {}
> +    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR id() :__id_(0) {}
>  private:
>      void __init();
>      void operator=(const id&); // = delete;
>
> The old design was to count on the loader to zero out the id, and if the
> ctor happened afterwards, it did nothing.  This was replaced with an
> attempt to force the construction at compile time.  I don't recall exactly
> why the old design started failing, but it did, at about the same time
> constexpr was introduced into clang.
>
> Unfortunately we can not apply constexpr to:
>
> locale::id ctype<char>::id;
>
> because it isn't truly const.  It gets modified the first time its __get()
> function gets called.
>
> None of this is 100% portable code.  It is currently working on apple
> platforms.  I'm not sure why it is not working on linux.  We can #ifdef the
> id() ctor if need be.  Or if there is some clang-specfic syntax to force a
> zero-initialization at compile/link time and after that consider the class
> constructed, that would be fine too.  I don't know what that syntax is
> though.
>
> Howard
>
> On Aug 19, 2013, at 12:20 PM, toki loki <tokiloki7 at gmail.com> wrote:
>
> > Problems is static constructor of
> >
> > locale::id ctype<char>::id;
> >
> > is called after
> >     install(&make<_VSTD::ctype<char> >((ctype_base::mask*)0, false, 1u));
> >
> >
> > ~"#0  id (this=<optimized out>) at
> /home/vv/kom/libcxx/include/__locale:131\n"
> > >~"#1  __static_initialization_and_destruction_0 (__initialize_p=1,
> __priority=65535) at /home/vv/kom/libcxx/src/locale.cpp:879\n"
> > >~"#2  0xb7f350bd in _GLOBAL__sub_I_locale.cpp(void) () at
> /home/vv/kom/libcxx/src/locale.cpp:6144\n"
> > >~"#3  0x45a7b696 in call_init.part.0 () from /lib/ld-linux.so.2\n"
> > >~"#4  0x45a7b75b in _dl_init_internal () from /lib/ld-linux.so.2\n"
> >
> > >~"#5  0x45a6d18f in _dl_start_user () from /lib/ld-linux.so.2\n"
> >
> >
> > I use Makefile
> >
> > LIBCXX_INCLUDE = $(HOME)/kom/libcxx/include/
> > LIBCXX_LIB = $(HOME)/kom/libcxx-build/lib/
> > LIBCXXABI_LIB = $(HOME)/kom/libcxxabi/lib/
> >
> > all:
> >       clang++ -g -O0 -fno-inline -std=c++11 -stdlib=libc++
> -I$(LIBCXX_INCLUDE) main.cpp -L$(LIBCXX_LIB) -Wl,-rpath $(LIBCXX_LIB)
> -L$(LIBCXXABI_LIB) -Wl,-rpath $(LIBCXXABI_LIB) -lc++abi -pthread
> >
> >
> > and clang version clang version 3.3
> >
> >
> > On Mon, Aug 19, 2013 at 6:32 PM, Howard Hinnant <hhinnant at apple.com>
> wrote:
> > 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
> >
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130819/df41d051/attachment.html>


More information about the cfe-dev mailing list