An Embedded Engineer’s Blog

とある組み込みエンジニアの備忘録的なブログです。

ClangNet(libclangの.NET(C#) Binding)によるC/C++ソースコードの解析 - その1

まえがき

LLVM/Clangに同梱されているlibclangの.NET(C#) Bindingライブラリ(ClangNet)を作成しました。
libclangはC/C++/Objective-Cソースコードの解析や自動補完機能を提供する高レベルのAPIで、オリジナルはC言語ベースのAPIが提供されています。


C言語のままだとかなり使い勝手が悪いため、.NETのP/Invoke機能(マネージドコードから動的ライブラリ内のネイティブコードを呼び出す仕組み)を用いてlibclangのWrapperを作成し、C#扱いやすいようにクラスベースのライブラリ化しました。


プロジェクト一式はGitHubにアップロードしています。


なお、以下の環境でビルドおよび簡易的な動作確認を行っています。

※ すべての機能に対するテストは出来ていませんので、不具合等ありましたらご連絡いただければと思います。


準備

ClangNetを使用するためには、LLVM/Clang内に同梱されているlibclang(.dllや.dylib)を取得する必要があります。
以下はWindowsの場合の例を記載します。

  1. 公式からWindows 64bit用のインストーラをダウンロード (現在はVer.8.0.1に対応しています)
  2. ダウンロードしたインストーラからLLVM/Clangをインストール
  3. LLVM/Clangインストール先からlibclang.dllを取得 (デフォルでは、"C:\Program Files\LLVM\bin\llvmclang.dll)
  4. ClangNetを使ったプログラムの実行ファイルと同じ場所にlibclang.dllを配置 (GitHubのサンプルでは、「ClangNet.CUI」プロジェクトをビルドして実行ファイルが生成されたディレクトリ内に配置します)
  5. ClangNetを使ったプログラムを実行

MacLinuxの場合も同様にして、libclangのライブラリファイルを実行ファイルディレクトリ内に配置することで対応できると思います (拡張子は、Macの場合は.dylib、Linuxの場合は.soとなります)。


サンプル

今回は、基本的な使い方として、以下の2種類のサンプルを用意しました。

※ 下記に記載しているサンプルコードは、必要な部分のみに絞って記載していますので、GitHubのコードとは異なります。 動作可能なサンプルはGitHubから取得してください。


解析対象ソース

今回は解析対象ソースとして以下のような簡単なヘッダとソースファイルを用意しました。


[test.h]

int main(void);
int Add(int a, int b);

class TestClass
{
public:
    TestClass()
    {
        this->m_a = 0;
        this->m_b = 0;
    }

    TestClass(int a, int b);

    ~TestClass(){}

    int Add();

private:
    int m_a;
    int m_b;
};


[test.cpp]

#include <iostream>
#include "test.h"

using namespace std;

int Add(int a, int b)
{
    return a + b;
}

TestClass::TestClass(int a, int b)
{
    this->m_a = a;
    this->m_b = b;
}

int TestClass::Add()
{
    return this->m_a + this->m_b;
}

int main(void)
{
    cout << "Hello, World" << endl;

    int a = 1;
    int b = 2;

    int c = Add(a, b);

    return 0;
}


AST(Abstract Syntax Tree)の解析
using ClangNet;

public void Parse(string src_path,                // ソースファイルパス
                  string[] command_line_args,     // clang実行時に指定するオプション
                  TranslationUnitFlags options,   // Translation Unit解析オプション
                  bool display_diag)              // ダイアグメッセージ表示フラグ
{
    // インデックスを作成
    using(var index = Clang.CreateIndex(false, display_diag))
    {
        // ソースファイルをパースし、Translation Unit Objectを作成
        using(var tu = index.ParseTranslationUnit(src_path, command_line_args, new ClangUnsavedFile[0], options))
        {
            // Translation Unitのカーソルを取得
            var cursor = tu.Cursor;

            // Cursor VisitorとASTの深さ(Depth)を指定して、カーソルの子要素を探索
            cursor.VisitChildren(this.Visitor, 0);
        }
    }
}

private ChildVisitResult Visitor(ClangCursor cursor,  // 現在のカーソル
                                 ClangCursor parent,  // 親カーソル
                                 int depth)           // 現在の深さ
{
    // カーソル位置を取得
    var loc = cursor.Location;

    // カーソルが解析対象ソースファイルの場合
    if (loc.IsFromMainFile == true)
    {
        // 解析処理を呼び出し
        this.VisitChild(cursor, depth);
    }
    else
    {
        /* システムインクルードヘッダ内 */
        if (loc.IsInSystemHeader == true)
        {
            /* 無視 */
        }
        else
        {
            // 解析処理を呼び出し
            this.VisitChild(cursor, depth);
        }
    }

    return ChildVisitResult.Continue;
}

private void VisitChild(ClangCursor cursor, int depth)
{
    // インデント用空白文字
    var indent = new string(' ', depth * 2);

    // カーソルの種別
    var kind = cursor.Kind;

    // カーソルが指す文字列
    var name = cursor.Spelling;

    // カーソル位置
    var loc = cursor.Location;

    // カーソルの実ファイル位置
    var floc = loc.FileLocation;

    // ファイル名
    var file = floc.File.FileName;

    // ファイル行番号
    var line = floc.Line;

    // ファイル列番号
    var col = floc.Column;

    // カーソル情報を出力
    Console.WriteLine($"{indent}[{kind}] {name} @ {file}[L.{line},C.{col}]");

    // Cursor VisitorとASTの深さ(現在のDepth + 1)を指定して、カーソルの子要素を探索
    cursor.VisitChildren(this.Visitor, depth + 1);
}


実行結果は以下のようになります。

[FunctionDeclaration] main @ ./Code/inc/test.h[L.1,C.5]
[FunctionDeclaration] Add @ ./Code/inc/test.h[L.2,C.5]
  [ParmDeclaration] a @ ./Code/inc/test.h[L.2,C.13]
  [ParmDeclaration] b @ ./Code/inc/test.h[L.2,C.20]
[ClassDeclaration] TestClass @ ./Code/inc/test.h[L.4,C.7]
  [CXXAccessSpecifier]  @ ./Code/inc/test.h[L.6,C.1]
  [Constructor] TestClass @ ./Code/inc/test.h[L.7,C.5]
    [CompoundStatement]  @ ./Code/inc/test.h[L.8,C.5]
      [BinaryOperator]  @ ./Code/inc/test.h[L.9,C.9]
        [MemberReferenceExpression] m_a @ ./Code/inc/test.h[L.9,C.15]
          [CXXThisExpression]  @ ./Code/inc/test.h[L.9,C.9]
        [IntegerLiteral]  @ ./Code/inc/test.h[L.9,C.21]
      [BinaryOperator]  @ ./Code/inc/test.h[L.10,C.9]
        [MemberReferenceExpression] m_b @ ./Code/inc/test.h[L.10,C.15]
          [CXXThisExpression]  @ ./Code/inc/test.h[L.10,C.9]
        [IntegerLiteral]  @ ./Code/inc/test.h[L.10,C.21]
  [Constructor] TestClass @ ./Code/inc/test.h[L.13,C.5]
    [ParmDeclaration] a @ ./Code/inc/test.h[L.13,C.19]
    [ParmDeclaration] b @ ./Code/inc/test.h[L.13,C.26]
  [Destructor] ~TestClass @ ./Code/inc/test.h[L.15,C.5]
    [CompoundStatement]  @ ./Code/inc/test.h[L.15,C.17]
  [CXXMethod] Add @ ./Code/inc/test.h[L.17,C.9]
  [CXXAccessSpecifier]  @ ./Code/inc/test.h[L.19,C.1]
  [FieldDeclaration] m_a @ ./Code/inc/test.h[L.20,C.9]
  [FieldDeclaration] m_b @ ./Code/inc/test.h[L.21,C.9]
[UsingDirective]  @ ./Code/src/test.cpp[L.4,C.17]
  [NamespaceReference] std @ ./Code/src/test.cpp[L.4,C.17]
[FunctionDeclaration] Add @ ./Code/src/test.cpp[L.6,C.5]
  [ParmDeclaration] a @ ./Code/src/test.cpp[L.6,C.13]
  [ParmDeclaration] b @ ./Code/src/test.cpp[L.6,C.20]
  [CompoundStatement]  @ ./Code/src/test.cpp[L.7,C.1]
    [ReturnStatement]  @ ./Code/src/test.cpp[L.8,C.5]
      [BinaryOperator]  @ ./Code/src/test.cpp[L.8,C.12]
        [FirstExpression] a @ ./Code/src/test.cpp[L.8,C.12]
          [DeclarationReferenceExpression] a @ ./Code/src/test.cpp[L.8,C.12]
        [FirstExpression] b @ ./Code/src/test.cpp[L.8,C.16]
          [DeclarationReferenceExpression] b @ ./Code/src/test.cpp[L.8,C.16]
[Constructor] TestClass @ ./Code/src/test.cpp[L.11,C.12]
  [TypeReference] class TestClass @ ./Code/src/test.cpp[L.11,C.1]
  [ParmDeclaration] a @ ./Code/src/test.cpp[L.11,C.26]
  [ParmDeclaration] b @ ./Code/src/test.cpp[L.11,C.33]
  [CompoundStatement]  @ ./Code/src/test.cpp[L.12,C.1]
    [BinaryOperator]  @ ./Code/src/test.cpp[L.13,C.5]
      [MemberReferenceExpression] m_a @ ./Code/src/test.cpp[L.13,C.11]
        [CXXThisExpression]  @ ./Code/src/test.cpp[L.13,C.5]
      [FirstExpression] a @ ./Code/src/test.cpp[L.13,C.17]
        [DeclarationReferenceExpression] a @ ./Code/src/test.cpp[L.13,C.17]
    [BinaryOperator]  @ ./Code/src/test.cpp[L.14,C.5]
      [MemberReferenceExpression] m_b @ ./Code/src/test.cpp[L.14,C.11]
        [CXXThisExpression]  @ ./Code/src/test.cpp[L.14,C.5]
      [FirstExpression] b @ ./Code/src/test.cpp[L.14,C.17]
        [DeclarationReferenceExpression] b @ ./Code/src/test.cpp[L.14,C.17]
[CXXMethod] Add @ ./Code/src/test.cpp[L.17,C.16]
  [TypeReference] class TestClass @ ./Code/src/test.cpp[L.17,C.5]
  [CompoundStatement]  @ ./Code/src/test.cpp[L.18,C.1]
    [ReturnStatement]  @ ./Code/src/test.cpp[L.19,C.5]
      [BinaryOperator]  @ ./Code/src/test.cpp[L.19,C.12]
        [FirstExpression] m_a @ ./Code/src/test.cpp[L.19,C.18]
          [MemberReferenceExpression] m_a @ ./Code/src/test.cpp[L.19,C.18]
            [CXXThisExpression]  @ ./Code/src/test.cpp[L.19,C.12]
        [FirstExpression] m_b @ ./Code/src/test.cpp[L.19,C.30]
          [MemberReferenceExpression] m_b @ ./Code/src/test.cpp[L.19,C.30]
            [CXXThisExpression]  @ ./Code/src/test.cpp[L.19,C.24]
[FunctionDeclaration] main @ ./Code/src/test.cpp[L.22,C.5]
  [CompoundStatement]  @ ./Code/src/test.cpp[L.23,C.1]
    [CallExpression] operator<< @ ./Code/src/test.cpp[L.24,C.5]
      [CallExpression] operator<< @ ./Code/src/test.cpp[L.24,C.5]
        [DeclarationReferenceExpression] cout @ ./Code/src/test.cpp[L.24,C.5]
        [FirstExpression] operator<< @ ./Code/src/test.cpp[L.24,C.10]
          [DeclarationReferenceExpression] operator<< @ ./Code/src/test.cpp[L.24,C.10]
        [FirstExpression]  @ ./Code/src/test.cpp[L.24,C.13]
          [StringLiteral] "Hello, World" @ ./Code/src/test.cpp[L.24,C.13]
      [FirstExpression] operator<< @ ./Code/src/test.cpp[L.24,C.28]
        [DeclarationReferenceExpression] operator<< @ ./Code/src/test.cpp[L.24,C.28]
      [FirstExpression] endl @ ./Code/src/test.cpp[L.24,C.31]
        [DeclarationReferenceExpression] endl @ ./Code/src/test.cpp[L.24,C.31]
    [DeclarationStatement]  @ ./Code/src/test.cpp[L.26,C.5]
      [VarDeclaration] a @ ./Code/src/test.cpp[L.26,C.9]
        [IntegerLiteral]  @ ./Code/src/test.cpp[L.26,C.13]
    [DeclarationStatement]  @ ./Code/src/test.cpp[L.27,C.5]
      [VarDeclaration] b @ ./Code/src/test.cpp[L.27,C.9]
        [IntegerLiteral]  @ ./Code/src/test.cpp[L.27,C.13]
    [DeclarationStatement]  @ ./Code/src/test.cpp[L.29,C.5]
      [VarDeclaration] c @ ./Code/src/test.cpp[L.29,C.9]
        [CallExpression] Add @ ./Code/src/test.cpp[L.29,C.13]
          [FirstExpression] Add @ ./Code/src/test.cpp[L.29,C.13]
            [DeclarationReferenceExpression] Add @ ./Code/src/test.cpp[L.29,C.13]
          [FirstExpression] a @ ./Code/src/test.cpp[L.29,C.17]
            [DeclarationReferenceExpression] a @ ./Code/src/test.cpp[L.29,C.17]
          [FirstExpression] b @ ./Code/src/test.cpp[L.29,C.20]
            [DeclarationReferenceExpression] b @ ./Code/src/test.cpp[L.29,C.20]
    [ReturnStatement]  @ ./Code/src/test.cpp[L.31,C.5]
      [IntegerLiteral]  @ ./Code/src/test.cpp[L.31,C.12]


インクルードファイルの依存関係解析
using ClangNet;

public void Parse(string src_path,                // ソースファイルパス
                  string[] command_line_args,     // clang実行時に指定するオプション
                  TranslationUnitFlags options,   // Translation Unit解析オプション
                  bool display_diag)              // ダイアグメッセージ表示フラグ
{
    // インデックスを作成
    using(var index = Clang.CreateIndex(false, display_diag))
    {
        // ソースファイルをパースし、Translation Unit Objectを作成
        using(var tu = index.ParseTranslationUnit(src_path, command_line_args, new ClangUnsavedFile[0], options))
        {
            // Translation Unitのカーソルを取得
            var cursor = tu.Cursor;

            // Visitorを指定してインクルードファイルを再帰的に走査
            tu.GetInclusions(this.Visitor, IntPtr.Zero);
        }
    }
}

private void Visitor(ClangFile file,                        // 現在のファイル
                     ClangSourceLocation[] location_stack,  // インクルード位置のスタック
                     IntPtr client_data)                    // クライアントデータへのポインタ
{
    // インクルードの深さ
    var depth = location_stack.Length;

    // インデント用空白文字
    var indent = new string(' ', depth * 2);

    // インクルードファイルのフルパス
    var filename = Path.GetFullPath(file.FileName());

    // インクルードファイルパスの出力
    Console.WriteLine($"{indent}{filename}");
}


実行結果は以下のようになります。

C:/Users/shin/source/repos/ClangNet/ClangNet.CUI/bin/Debug/netcoreapp2.1/Code/src/test.cpp
  C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/iostream
    C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/istream
      C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/ostream
        C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/ios
          C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xlocnum
            C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/climits
              C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/yvals_core.h
                C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/crtdefs.h
                  C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/vcruntime.h
                    C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/sal.h
                      C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/concurrencysal.h
                    C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/vadefs.h
                  C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt.h
                C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xkeycheck.h
              C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/limits.h
            C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/cmath
              C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/yvals.h
                C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/crtdbg.h
                  C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/vcruntime_new_debug.h
                    C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/vcruntime_new.h
                C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/use_ansi.h
              C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/cstdlib
                C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/math.h
                  C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_math.h
                C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/stdlib.h
                  C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_malloc.h
                  C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_search.h
                    C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/stddef.h
                  C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_wstdlib.h
              C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xtgmath.h
                C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xtr1common
            C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/cstdio
              C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/stdio.h
                C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_wstdio.h
                  C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_stdio_config.h
            C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/streambuf
              C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xiosbase
                C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/share.h
                  C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_share.h
                C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/system_error
                  C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/cerrno
                    C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/errno.h
                  C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/stdexcept
                    C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/exception
                      C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/type_traits
                        C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xstddef
                          C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/cstddef
                          C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/initializer_list
                      C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/malloc.h
                      C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/vcruntime_exception.h
                        C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/eh.h
                          C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_terminate.h
                    C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xstring
                      C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/iosfwd
                        C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/cstring
                          C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/string.h
                            C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_memory.h
                              C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_memcpy_s.h
                                C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/vcruntime_string.h
                            C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_wstring.h
                        C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/cwchar
                          C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/wchar.h
                            C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_wconio.h
                            C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_wctype.h
                            C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_wdirect.h
                            C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_wio.h
                            C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_wprocess.h
                            C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/corecrt_wtime.h
                            C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/sys/stat.h
                              C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/sys/types.h
                      C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xmemory
                        C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/cstdint
                          C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/stdint.h
                        C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/limits
                          C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/cfloat
                            C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/float.h
                        C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/new
                        C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xatomic.h
                          C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/intrin0.h
                        C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xutility
                          C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/utility
                  C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xcall_once.h
                  C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xerrc.h
                C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xlocale
                  C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/memory
                    C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/typeinfo
                      C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/vcruntime_typeinfo.h
                  C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xfacet
                  C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xlocinfo
                    C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.22.27905/include/xlocinfo.h
                      C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/ctype.h
                      C:/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt/locale.h
  C:/Users/<user>/source/repos/ClangNet/ClangNet.CUI/bin/Debug/netcoreapp2.1/Code/inc/test.h


Windows用libclangでは、システムインクルードディレクトリとして、デフォルトでVisual StudioWindows Kitsが設定されるようです。
同じコードをMacで動かすと、システムインクルードの方は何も出力されないため、command_line_argsに-I オプションでインクルードパスを指定する必要があります。


あとがき

今後は、もう少し詳しい使い方を紹介していきます。