Skip to content

Using the libc++ with ASan and UBSan from apt.llvm.org (issue in __ubsan_handle_dynamic_type_cache_miss? libc++ vs. libstdc++ clash?) #145299

Open
@exoosh

Description

@exoosh

Hi,

we're building a DSO on Linux against libc++ with ASan and UBSan instrumentation turned on.

A simple program then loads the DSO and during static initialization the issue occurs (excerpt):

#1 0x70f927eb9995 in __dynamic_cast /build/gcc-14-ig5ci0/gcc-14-14.2.0/build/x86_64-linux-gnu/libstdc++-v3/libsupc++/../../../../src/libstdc++-v3/libsupc++/dyncast.cc:80:28
#2 0x70f9287260d5  (/usr/lib/llvm-20/lib/clang/20/lib/linux/libclang_rt.asan-x86_64.so+0x1260d5) (BuildId: 5f516f9b88bd4a4401541f629081b4f212f55ba4)
#3 0x70f928725432  (/usr/lib/llvm-20/lib/clang/20/lib/linux/libclang_rt.asan-x86_64.so+0x125432) (BuildId: 5f516f9b88bd4a4401541f629081b4f212f55ba4)
#4 0x70f928725407 in __ubsan_handle_dynamic_type_cache_miss (/usr/lib/llvm-20/lib/clang/20/lib/linux/libclang_rt.asan-x86_64.so+0x125407) (BuildId: 5f516f9b88bd4a4401541f629081b4f212f55ba4)
#5 0x6cf91aee84cb in std::__1::basic_ifstream<char, std::__1::char_traits<char>>::basic_ifstream(char const*, unsigned int) /usr/lib/llvm-20/bin/../include/c++/v1/fstream:1156:60
...

The call at position 5 is essentially this line: std::ifstream cmdlineFile("/proc/self/cmdline");.

It took me a while to realize, but as you can see my DSO linked against libc++ as evidenced by the presence of /usr/lib/llvm-20/bin/../include/c++/v1/fstream at position 5.

However, at position 1 we can see /build/gcc-14-ig5ci0/gcc-14-14.2.0/build/x86_64-linux-gnu/libstdc++-v3/libsupc++/../../../../src/libstdc++-v3/libsupc++/dyncast.cc which is clearly related to libstdc++!

I think the issue here is that the ASan runtime library is linked against libstdc++, which can be confirmed by:

$ readelf -a /usr/lib/llvm-20/lib/clang/20/lib/linux/libclang_rt.asan-x86_64.so|grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]

... so seemingly UBSan attempts to validate an object with dynamic_cast from libstdc++, whereas the object got created with libc++?

Is there an extra set of sanitizer runtime libraries that comes with libc++-dev (libc++-20-dev) that I can use, or do I have to build my own?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions