[libcxx-dev] Building a program with -D_LIBCPP_DEBUG=1 against a libc++ that is not itself built with that define

Stephan Bergmann via libcxx-dev libcxx-dev at lists.llvm.org
Fri Oct 29 08:09:06 PDT 2021

At least with recent LLVM 14 trunk,

> $ cat test.cc
> #include <string>
> int main() { "longlonglonglonglonglong" + std::to_string(0); }

> $ clang++ -stdlib=libc++ -D_LIBCPP_DEBUG=1 test.cc
> $ ./a.out
> Segmentation fault


> #0  std::__1::__libcpp_db::swap (this=0x7f3187f63318 <std::__1::__get_db()::db>, c1=<optimized out>, c2=0x7ffe55d37840) at src/debug.cpp:461
> #1  0x0000000000401744 in std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string (this=0x7ffe55d37858, __str=...) at include/c++/v1/string:1991
> #2  0x0000000000401334 in std::__1::operator+<char, std::__1::char_traits<char>, std::__1::allocator<char> > (__lhs=0x403010 "longlonglonglonglonglong", __rhs=...) at include/c++/v1/string:4342
> #3  0x00000000004012a9 in main () at test.cc:2

because the std::string instance returned from std::to_string 
(implemented in libc++, not itself built with -D_LIBCPP_DEBUG=1) never 
called __libcpp_db::__insert_c(this), so __libcpp_db::swap doesn't find 
it in the __cbeg_/__cend_ table and then dereferences a null pointer.

I wonder how usable and mature -D_LIBCPP_DEBUG=1 is considered in 
practice.  Is this a well-known shortcoming (in which case it might be 
good to mention it explicitly in libcxx/docs/DesignDocs/DebugMode.rst, 
beyond just "Users should compile their whole program at the same 
debugging level."), or would it be worth filing a bug?

More information about the libcxx-dev mailing list