読者です 読者をやめる 読者になる 読者になる

同じ CXString に複数回 clang_getCString() を適用してはいけない…?

CXString は libclang での文字列型で,C の文字列に直すには clang_getCString() を使う.

CXString s = clang_getCursorSpelling(cursor);
char const* p = clang_getCString(s);

しかし,どうやら複数回 clang_getCString() を適用すると1回目と2回目では違う値が返ってくることに気づいた.

CXString s = clang_getCursorSpelling(cursor);
char const* p1 = clang_getCString(s); // p1 は CXString が表す文字列で NULL でない
char const* p2 = clang_getCString(s); // p2 は NULL ...

次のように,予め文字列が NULL でないかをチェックするために複数回使っていたら SEGV が出てデバッグする羽目になった.

CXString s = clang_getCursorSpelling(cursor);
if (clang_getCString(s)) {
    // この if 文には入る
    char const* p = clang_getCString(s);  // p は NULL !!!
}

仕方ないので,次のようにして回避した.

CXString s = clang_getCursorSpelling(cursor);
char const* cs = clang_getCString(s);
if (cs) {
    // この if 文には入る
    char const* p = cs;  // p は NULL じゃないヤッター
}

clang_getCString() のドキュメント には特に何も明記されていない…

  • 環境
    • OS X 10.9
    • clang 3.4
    • libc++ 3.4