<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/145299>145299</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Using the libc++ with ASan and UBSan from apt.llvm.org (issue in __ubsan_handle_dynamic_type_cache_miss? libc++ vs. libstdc++ clash?)
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc++
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          exoosh
      </td>
    </tr>
</table>

<pre>
    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:

```
AddressSanitizer:DEADLYSIGNAL
================================================================= 
#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?
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUV01v2zwS_jX0ZWCBoj5sHXyQk3jfAEX3kO1hTwZFjSxuKdIgKcfur1-QUhwnm2ILvOmhhmBIJPVwPp55OOLOyYNG3JBiS4r7BR99b-wGz8a4ftGY9rL5SxJ2R2hNaP2MhK0sQjNK1Up9AA73T_8Eo-GL1OMZ-IFL7Two2QjCtoRt4Vn6HuonroHrFr5tw11YY8cBtedeGg1-tBpbMDqZtqnByeGoEI7WHCwfwPeoQRneunAb9wxo7WiDES7ACJBaesmV_DGD9gjSuRHBCDFaR7J6QiclnS9a121r0bknHt79gZZk9f1Dff_l30-P__hafwmrs_s__YLgBstSoOcV7Sq2wqaqqgKkhv2-vWg-SLEX3HkgbBdTS9juIMQyzZfyUAhJX5_TPGEJvVl3Xpf7Ml-qkP_lQY-E7ZRsnG9nAixP2Tw0HuchwnZJ8r9_zopfe7m96GBtIgTJ6jUlWc3Wk4vsxcX1ipW0LYCwNWG70dkJJvyr07Bk9PosFNcHwnY3Q9GX6SnO7q1PuON6OfmaOEPYlp7TuAVhVdhlG8Lx2JKshqIr0rKrmvW6aXOe5zQt8rQrWUXXaZN3LGVdUTQ8J6yarM5urC7yjP1mq8MWn2B1_sZquproNDaO633Pdavwyi1_OeJecNHjfpDO_Xb_6OoT_CuAnkvRVSlHXOeiCf45H7BIVu_36XTTcCfFXnbOW-QDye5Ezy1hdx8sDTN7b7n07mVd9hCvD4DYOiwAYbTzhNUBcdRRqluQ2k_-_SSEjdQvNSW1UGOLIaLX8jmlhO2uBtdpWpQkq6McJknyTiAJrf_VIwiuFHAPR-NkVNcCpAN0DnXQXHUB30sHSmoMwSYlvfr_4hKIoQ3zO6kwEoARtjtaE4reoeqCjdOKOFWRbEtKOp8Ijx68Md9hQODw3EuF4A1YDHKPITjN6IE7uJgRBNfgEGG4xINCSf0d2-vRFINZvx5Q03N4F0-yRS2wheYST4-jRRcGwHTBo0-Jd0nfhnH27y_zjCeMxLmdTuEZr_5MJvxZ-lzSkC3RB7YIhdyqC1hU3GMbEnhNxivkNERYOic-EEt_vznNe7ThFnzPfRyOzYUdtZcDhs7DcnuBiYy3iX-3y91sWIhug6HQOmmHmPwPOwXC8sC3FlUHS_7z4vs7-rW6O1g8wteHh_uHe0JroGf69pcGVZvnWQW3v6eeW2xfAhCrsNi-cTpxJilJ8WnI4rMBhxvAdyKUJAk4A3uHOEh9UJf93Ety73E4ehfodOJKttwjcA2m-Q8KP7WfpKS3bU5gZWfN8BEl0CKfmswZ4GA8CIuRsRHsRjqy3UzS-IaN--LZWw4OfVAN99JXvuOnxJm_wgzorka-Qi9bPAUzg1C-GWd0ngoxjRCPkcKjizJoLLQGHqHnp6iQUQWCEppnTbLdot1kbZVVfIGbdFXQcpVW63LRb4oGS-xKQVfIqjxnaZMXmahELmhTijZdyA2jrKAly2iVl6xM0nXDujVPq3WXpVxwklMcuFRJKIXE2MMilusmzQtWVQvFG1QufmUwdqu-LHx12E0soGY8OJJTJZ13rzheeoWbby60-iEx_-fjImaWH_0VIARxko5f7lBItrvd5uSSt1wBobjrQ_5ZtRit2vTeH-MXBtsFLZa-H5tEmGGWhheFOFoTSBUOimCQI2w3x-e0Yf8NAAD__3-MA0c">