<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">