<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/138881>138881</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-c CXString] What is the lifetime of a CXString?
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
illusory0x0
</td>
</tr>
</table>
<pre>
In the `clang-c/Index.h` header file, there is no clear description of the CXString's lifetime.
CXString's lifetime might be static, not relevant to `CXTranslationUnit` and `CXIndex`, or depending on both `CXTranslationUnit` and `CXIndex`.Those behaviors I've observed. But what is the actually lifetime of the CXString?
```c++
/**
* A character string.
*
* The \c CXString type is used to return strings from the interface when
* the ownership of that string might differ from one call to the next.
* Use \c clang_getCString() to retrieve the string data and, once finished
* with the string data, call \c clang_disposeString() to free the string.
*/
typedef struct {
const void *data;
unsigned private_flags;
} CXString;
```
### Example 1 (depending on CXTranslationUnit and CXIndex)
```c++
#include <clang-c/Index.h>
#include <iostream>
#include <vector>
int main() {
CXIndex index = clang_createIndex(0, 0); // Create index
CXTranslationUnit unit =
clang_parseTranslationUnit(index, "file.cpp", nullptr, 0, nullptr, 0,
CXTranslationUnit_DetailedPreprocessingRecord); // Parse "file.cpp"
if (unit == nullptr) {
std::cerr << "Unable to parse translation unit. Quitting.\n";
return 0;
}
CXCursor cursor = clang_getTranslationUnitCursor(
unit); // Obtain a cursor at the root of the translation unit
std::vector<CXString> vec;
clang_visitChildren(
cursor,
[](CXCursor current_cursor, CXCursor parent, CXClientData client_data) {
CXString css =
clang_getCursorSpelling(current_cursor);
auto vec = (std::vector<CXString> *)client_data;
vec->push_back(css);
return CXChildVisit_Recurse;
},
&vec);
clang_disposeTranslationUnit(unit);
clang_disposeIndex(index);
for (auto x : vec) {
std::cout << clang_getCString(x) << '\n';
clang_disposeString(x);
}
}
```
```
==29048==ERROR: AddressSanitizer: heap-use-after-free on address 0x52100006fa08 at pc 0x7b8d76a7d96f bp 0x7ffecc6e3a90 sp 0x7ffecc6e3238
READ of size 9 at 0x52100006fa08 thread T0
#0 0x7b8d76a7d96e in strlen ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:391
#1 0x7b8d7455712d in std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (/lib/x86_64-linux-gnu/libstdc++.so.6+0x15712d) (BuildId: ca77dae775ec87540acd7218fa990c40d1c94ab1)
#2 0x633abfaa6b9f in main (/home/illu/playgound/cxx/libclang-example/build/main+0x2b9f) (BuildId: d56c11e25e7e94615c48a390146a7373f424c47f)
#3 0x7b8d7402a1c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
#4 0x7b8d7402a28a in __libc_start_main_impl ../csu/libc-start.c:360
#5 0x633abfaa6484 in _start (/home/illu/playgound/cxx/libclang-example/build/main+0x2484) (BuildId: d56c11e25e7e94615c48a390146a7373f424c47f)
0x52100006fa08 is located 1288 bytes inside of 4096-byte region [0x52100006f500,0x521000070500)
freed by thread T0 here:
#0 0x7b8d76aff888 in operator delete(void*, std::align_val_t) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:170
#1 0x7b8d74c4f71e (/usr/lib/llvm-18/lib/libclang-18.so.18+0x44f71e) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#2 0x7b8d754d2430 (/usr/lib/llvm-18/lib/libclang-18.so.18+0xcd2430) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#3 0x7b8d753320a1 (/usr/lib/llvm-18/lib/libclang-18.so.18+0xb320a1) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#4 0x7b8d74c27a98 in clang_disposeTranslationUnit (/usr/lib/llvm-18/lib/libclang-18.so.18+0x427a98) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#5 0x633abfaa6a36 in main (/home/illu/playgound/cxx/libclang-example/build/main+0x2a36) (BuildId: d56c11e25e7e94615c48a390146a7373f424c47f)
#6 0x7b8d7402a1c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
#7 0x7b8d7402a28a in __libc_start_main_impl ../csu/libc-start.c:360
#8 0x633abfaa6484 in _start (/home/illu/playgound/cxx/libclang-example/build/main+0x2484) (BuildId: d56c11e25e7e94615c48a390146a7373f424c47f)
previously allocated by thread T1 here:
#0 0x7b8d76afeaf8 in operator new(unsigned long, std::align_val_t) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:107
#1 0x7b8d74c414b3 (/usr/lib/llvm-18/lib/libclang-18.so.18+0x4414b3) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#2 0x7b8d74c43dc0 (/usr/lib/llvm-18/lib/libclang-18.so.18+0x443dc0) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#3 0x7b8d750d281d (/usr/lib/llvm-18/lib/libclang-18.so.18+0x8d281d) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#4 0x7b8d753cfd92 (/usr/lib/llvm-18/lib/libclang-18.so.18+0xbcfd92) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#5 0x7b8d75334e23 (/usr/lib/llvm-18/lib/libclang-18.so.18+0xb34e23) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#6 0x7b8d75338596 (/usr/lib/llvm-18/lib/libclang-18.so.18+0xb38596) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#7 0x7b8d753393c2 (/usr/lib/llvm-18/lib/libclang-18.so.18+0xb393c2) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#8 0x7b8d74c48a13 (/usr/lib/llvm-18/lib/libclang-18.so.18+0x448a13) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#9 0x7b8d6d4eff76 in llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/usr/lib/llvm-18/lib/../lib/libLLVM.so.18.1+0xceff76) (BuildId: 495b188fed20e21b476ccb1eaea212f4304fad28)
#10 0x7b8d6d4f016c (/usr/lib/llvm-18/lib/../lib/libLLVM.so.18.1+0xcf016c) (BuildId: 495b188fed20e21b476ccb1eaea212f4304fad28)
#11 0x7b8d6d4f02b2 (/usr/lib/llvm-18/lib/../lib/libLLVM.so.18.1+0xcf02b2) (BuildId: 495b188fed20e21b476ccb1eaea212f4304fad28)
#12 0x7b8d76a5ea41 in asan_thread_start ../../../../src/libsanitizer/asan/asan_interceptors.cpp:234
#13 0x7b8d7409caa3 in start_thread nptl/pthread_create.c:447
Thread T1 created by T0 here:
#0 0x7b8d76af51f9 in pthread_create ../../../../src/libsanitizer/asan/asan_interceptors.cpp:245
#1 0x7b8d6d5a7981 in llvm::llvm_execute_on_thread_impl(void* (*)(void*), void*, std::optional<unsigned int>) (/usr/lib/llvm-18/lib/../lib/libLLVM.so.18.1+0xda7981) (BuildId: 495b188fed20e21b476ccb1eaea212f4304fad28)
#2 0x7b8d6d4f00f4 in llvm::CrashRecoveryContext::RunSafelyOnThread(llvm::function_ref<void ()>, unsigned int) (/usr/lib/llvm-18/lib/../lib/libLLVM.so.18.1+0xcf00f4) (BuildId: 495b188fed20e21b476ccb1eaea212f4304fad28)
#3 0x7b8d74c3156d in clang_parseTranslationUnit2FullArgv (/usr/lib/llvm-18/lib/libclang-18.so.18+0x43156d) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#4 0x7b8d74c31188 in clang_parseTranslationUnit2 (/usr/lib/llvm-18/lib/libclang-18.so.18+0x431188) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#5 0x7b8d74c31087 in clang_parseTranslationUnit (/usr/lib/llvm-18/lib/libclang-18.so.18+0x431087) (BuildId: ea056e259864b6af08c46875208cc97be270ce0e)
#6 0x633abfaa689f in main (/home/illu/playgound/cxx/libclang-example/build/main+0x289f) (BuildId: d56c11e25e7e94615c48a390146a7373f424c47f)
#7 0x7b8d7402a1c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
#8 0x7b8d7402a28a in __libc_start_main_impl ../csu/libc-start.c:360
#9 0x633abfaa6484 in _start (/home/illu/playgound/cxx/libclang-example/build/main+0x2484) (BuildId: d56c11e25e7e94615c48a390146a7373f424c47f)
SUMMARY: AddressSanitizer: heap-use-after-free ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:391 in strlen
Shadow bytes around the buggy address:
0x52100006f780: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x52100006f800: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x52100006f880: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x52100006f900: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x52100006f980: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
=>0x52100006fa00: fd[fd]fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x52100006fa80: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x52100006fb00: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x52100006fb80: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x52100006fc00: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x52100006fc80: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
==29048==ABORTING
make: *** [Makefile:5: run_main] Error 1
```
### Example 2 (Not Relevant to CXTranslationUnit and CXIndex)
```C++
#include <clang-c/Index.h>
#include <iostream>
#include <vector>
int main() {
CXIndex index = clang_createIndex(0, 0); // Create index
CXTranslationUnit unit =
clang_parseTranslationUnit(index, "file.cpp", nullptr, 0, nullptr, 0,
CXTranslationUnit_None); // Parse "file.cpp"
if (unit == nullptr) {
std::cerr << "Unable to parse translation unit. Quitting.\n";
return 0;
}
CXCursor cursor = clang_getTranslationUnitCursor(
unit); // Obtain a cursor at the root of the translation unit
std::vector<CXString> vec;
clang_visitChildren(
cursor,
[](CXCursor current_cursor, CXCursor parent, CXClientData client_data) {
CXString css =
clang_getCursorSpelling(current_cursor);
auto vec = (std::vector<CXString> *)client_data;
vec->push_back(css);
return CXChildVisit_Recurse;
},
&vec);
clang_disposeTranslationUnit(unit);
clang_disposeIndex(index);
for (auto x : vec) {
std::cout << clang_getCString(x) << '\n';
clang_disposeString(x);
}
}
```
```
cmake -G Ninja -B build -S .; cmake --build build
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /home/illu/playgound/cxx/libclang-example/build
[2/2] Linking CXX executable main
./build/main
A
value
B
value
struct_value
struct A
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsW1tv27qW_jXKC2GDou4PebCduFOglz1Je6bzZFDUks1TmRRIynH2rx-QlG3Z8XS3qXYPNlDDcByRXPy4Lt9alGiqNV8LgNsgmQfJ3Q3tzEaqW940nZbqGe_xTSmr59u3ApkNoCDFrKFiPWEBWb4VFeynmyDFaAO0AoVq3kBAFrarAsQ1EhKxBqhCFWimeGu4FEjWTtbiy6NRXKwDkmnU8BoM38I0wLMAz662oS1fbwwqAWlDDWd2JiENUtDAjgqDjLQAF18-KSp0Q-1knwU3FiAVlW9zoIMU28HS4mpBVFyskRSolGbz_RKmnzZSAyphQ3dcKo3eBiTbAZKlBrWDaormnUFPG2qsJuyKKTMdbZrn04ouVREt_fotQPdmAZnbN54FZBmQmX3jGQrIDM0Q21BFmQGFtBs-7ZsOPT5ZiyULdpSPzHPr7NJpqKy6FJhOiX64RrWSWweICwOqpgzQ0wbEQZ5tkU8ClN7w1mOnph_cG6fidW0dwQqSAhCjTWMnskMF7M0BIvqse2zOn1ZrMIuDyfOAFD04xWEHbnA_S0UNtaZw5hMMUM0F1xuoDnKfuNlcDrCdHZDBhBXXrdRwOWetYDjfUaPEGsZqr4LatnXMoCCzdkGISaEN2kle2a5uwsi3dMJFV4VaxXfUwKpu6Fr71iC7G9h9PjR67wPW5pF_o_s93bYNoBAFJD9z2hfO6jz14KakOAm75lMRF6zpKkBBtHgZ2dH9i05caqOAbq-17YAZqfoWPOPCoC3lotdur64eGeLuM4jueoMwBdRAjzp38Ykt_GiOnOsv0cL18AOdel8uvbMfQXTnmu3Ly26p0nAZ0yT3ksgCBYRY6pqytg0IcbzSNU1rVI_ixf9-IRcSV3dgKG-g-kNBqyQDrblYPwCTqjpfyR8Wz-WsTmcI8dqa-LiQ6O4091GHCCFtqiCaBdGMgVJW-UHk1vFZ0LIB68pu0cicMDrtTNF_d9wY59vJQtiJo4PMng3w4UqQ3fV6XnRKS4WY_3My2hrMhRJ8T2vygwk6p-zh8j-WhnKB6EEeNS7klJTmwIiXsJ2045oPjrY4BdA92gHr4wjPeng7rrlZbHhTKRBDTKxHuThe8fkvIPlwsQqEWR37nvTQUtvSX2o4CHNneYm5rytPOUNj2deRg5nWBxc9cZ-T-9hC03g6upy8OFnJvmhnpF2wM0VA8m9rxhFYMUR3JmwHbBJE922nN6uSsq92eq1Pc_ZusfjiNPkvq9PVA1hkMBRkvWWoUJJaixyknJbbM-_LcDw5iqfVYe8DL_ADq_WdauuOJHf6sGwyQ37Sq5EiO3OIlCtZZ--GHQIp89GR9RNdTxpDJD5Y-s8LJh_-62KaFDjO_df7h4ePDxb4rKoUaP1IBTf8T1D22gZoO-k0TGhtQE1cdpICUd8V4X1CQowxTmuKcxtHLUN4n5V5laU0q4q0RmVrr9Q1MJZCRAuM9NkVEtmweLif3dnY0_xPQIWVdCHbbBTQCn3CvVYDEuHzqSwz29TYgEDTaUCWFx9a2dTS8FIfV0iWx-8rJrdbKa5cWrlihEFrpNJTLlgQzaIi9Jk5Cg8g4iTJQlJ5EL3FS6o5Wx0z1sIWTDZqTy6xoWplFOVGH5ptvET3AUlPvWQLivqwcs4RLb5HQD4ODFe8bKjyZYYPZeRSqtVlQJb7PF2l8aThottP1qLrlWyqPs9PtZymAZnjfeg01I-fd7yp3loAiNEsqyhkWQIsz5IYU1ZlJMxrWhSYxbgKWRHTMvTVRG99gvA-jSJa1pSmZVFbxdts32PbyC0EZGk3EgFZtg19XsvO1m1Ltt97iL7eAF_ZBGRZWkQBWfqaYY73pCzql2irJGVhCCSBDIo4DRMW5zQqcBinNIuyqI5JzOKsPkMbHd0EExqywqJdrSyIlTZUmZWtD1cOv3fWZ11BqwOyFK1peryXXW2FNEvy0yzxcBaS0xez2FErvm0bPwvTvbXYxLVPnW-ngxhLhlqO89hJdH3H1HOcxz-r5wDPLhiDa9RIRg1UKCR5jspnAxpxoXnlNj4xLtKJvYgUrG2eD5L5QESCbaF1vJBhd8FOZVmwQuXziZOQ3W_aULrGTXWd57nV2yGMUQUNGAhIbmt2F1GDWKQNX4vVjjYrm4y-n8mopqL_sxLwtPKTuOIumoUZfsFXLK6zEFBvx06rY0Q3zW47CU8RfrRhmNtgti1zvI_d-Jd2A4qTFEhS5GlcprTGOYvTPEsIzhkrshJIhhlgeBHNDlYSVySO8KtRMTd8JFTHqE2iiGAavhpV6YaPhOoU5YxktHC-9a3S5vUWduJHQn3GJDRK_w6-plE6El-nv4Svs9H5Ov8H8XWrYMdlp5tnRJsDVQ9oNfw2rQKtz2lVwJOr4vt7Ho20NfLfzqw4u8KsYVxGP8OsdvzYzBqzOKrY65k1dsNHZ1ZckTysXo0qd8PHZtYkYnVVkNfzvRs-InMeslAMJPqJLGSHj4QqHaDKkyL9CVR2-EiosgGqImI_YUE3fCRU-SAGcxq-3oKxGz4SqqJHlVYx1HXmMrKF4dlyoajePACTO1DPCykM7I1veejEI62heQ5Ifupfd4LZimOloA6iRX87Ond3KO5Pe8ZvrdlR8HH57979671f-jT0pZ1D-XLxcZGUYZ7XUBEMJCzjLGWsDIECJSGp4wjHNa08lOPiQ3xafY3DlI2Az8kZC184xEfK7_Hkv8ZHyisu_Tp85JSKE6BxaL3HpUifvvui41VJ9uyGi0-zJIoHcw920wWjNPI3XWzB1NcOfRHW9lj8vX1XLcVx5quPT8cqw7e60uOvtnJJWLtS8FzweKuMk8Eqjw6Q0KzIw_PwtN9WsAfWGVjJo9ZtrXjaWHqfmVnDDTabha2Krm09pXs-SpsgWhyrKC7MWPFbuWWM5H9kGB64jn-YvD4K7wE_QmILdKaXUUjNoR9JKae4YFGYpNVpZ3jtCRRZdk0zU-vd69ORm2X8bW0Uhnn-F-B_BnSYj7mrPYLGefZt0D-DGefZiJXbcY-Y_z13TvPR7pxmv2Qnno--Ey_-QTvxx8_v388e_vdHngL9gicsp-c5FuKGVvKpv4lLldWUe1Bbduv18-GB1CFvD27jZjm2S6irH3pfSsnxKFJGwVKMgqV4LRb31PD-7F57LylI5vbj7ocwDQW9Wj0DIeWrtTMUMgYSNgYS9lokg3hBDaxBuEJGCkB60KKgVaBBGI1yRNu24cyfeXBx5soeH1E9LdCyscUxwp7o_qDKcHeijF60hwgThCOEY4QThFOEM-SG_BfQFjVQG6Sg-lMK172mrm3pHqxYtukfydg2_-od-NFQ9vXFcN_DPZH1Hba8etGOajIQodxpsYs-dTTo4biuP3twmiQZ9Og09L00k20vpfZJ5U0jS9qcrbEYNnBbDUhVeYLthadeqZJrKfx-pNPDDqjO_HkYKQzlAhSy9W3dyKcTQObNpRR9RkzKr3ygAX90w_d4K4yiSJb_Bnamh7L0Ah6p8Kfw3H5gKKEG1-OdNYK_b3upR-bN-eB0fLULK68dRZjNPz58evvhTYBnW_rV9e2PHNqtTDJ_T7-CO-IZzRLbqDrh8nKQ3KF7paRC4ZUDD9eOsbnq8YM06GFwdvM7T7IdZC_-o8fYft05tl96hO2D9ZHfZ9V-n1X7fVbt91k1ZrMAmrxBH7j4N0WTOXIbIDR5RFMbIn37xF_1myM8m0xsgqz5uvMHsG3NY5lwirUn8ckEvQEBipr_t91tptzPCTTa0B2gEkCgJ8WNAYGM9Knp9Vs4PAuSOQnIktjc9Y6LrxbK4ssX5G_pOV5ypI9n08uNH55ZRe1o09lMPB989wfDV-f_osvz1zfVbVQVUUFv4DbM4jQlWRoWN5vbLE6ytGYJqSJMaVqFcREBjZKwzlOCgdzwW4JJghOchTHBYTGNI4pTlodFkZGSlHEQY9hS3kybZredSrW-4Vp3cBtGeZ6HNw0todHutx6ECHhCrtXyanJ3o27dvZCyW-sgxg3XRp_EGG4a9yORPruejq4nd-h_Br9xGP60gQ5_2HDTqeZ2Y0zrdomOXNfcbLpyyuS2vxFzuB_TKmnrImtaC1AHZNmvYHdL_i8AAP__GFEN6w">