CLion 2026.2 Help

Google サニタイザー

Sanitizers(英語) は、Google によって設計された動的コード分析用のオープンソースツールです。 CLion は、次の Sanitizers と統合されます。

  • AddressSanitizer (ASan)

  • LeakSanitizer (LSan)

  • ThreadSanitizer (TSan)

  • UndefinedBehaviorSanitizer (UBSsan)

  • MemorySanitizer (MSan)

Sanitizers は、Clang 3.1 以降および GCC 4.8 以降で実装されています。 すべてのサニタイザーは、Linux x86_64 マシンで使用できます。 Windows 10 では、MSVC ツールチェーンの clang-cl を使用して AddressSanitizer を使用できます。 macOS の場合、サポートされているサニタイザーは AddressSanitizer、ThreadSanitizer、UndefinedBehaviorSanitizer です。

Sanitizers はコンパイラーインスツルメンテーションに基づいているため、これらのツールの使用を開始するには、プロジェクトを再ビルドする必要があります。

Sanitizers の設定

コンパイラーフラグを指定する

  • 次のテンプレート行を調整して、 CMakeLists.txt に追加します。

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=[sanitizer_name] [additional_options] [-g] [-OX]")

    [sanitizer_name] の場合、次のいずれかを使用します。

    • AddressSanitizer の アドレス

    • LeakSanitizer の リーク

    • ThreadSanitizer の スレッド

    • undefined は UndefinedBehaviorSanitizer 用です (ほかのオプションも利用できます。詳細は UBSan セクションを参照してください)

    • MemorySanitizer の メモリ

    [Additional_flags]-fno-omit-frame-pointerfsanitize-recover/fno-sanitize-recover-fsanitize-blacklist などの他のコンパイルフラグです。

    警告メッセージにファイル名と行番号を含めるには、 [-g] を使用します。

    適切なパフォーマンスを得るために、最適化レベル [-OX] を追加してください(特定の Sanitizer ドキュメントの推奨事項を参照)。

CMake 以外のプロジェクト用の Sanitizers

Sanitizers 設定を調整する

  • 設定 | ビルド、実行、デプロイ | 動的解析ツール | Sanitizers に移動し、以下を設定します。

    Sanitizers 設定
    • 実行時フラグ

      このセクションでは、各サニタイザーのランタイムオプションを指定します。 これは手動で、または 既存の環境変数からフラグをインポートする ボタンをクリックして実行できます(変数 ASAN/MSAN/LSAN/TSAN_OPTIONS が表示されている場合、このボタンが使用可能になります)。 サニタイザー共通のフラグ(英語)を参照してください。

    • Sanitizer の出力を視覚的に表現する

      このチェックボックスをオンにすると、プレビューエディターとフレーム情報でツリービューが出力されます。

      CLion Sanitizers ビジュアル出力

      視覚化された出力を利用できるようにするには、少なくとも 3.8.0 で Clang に切り替えるか、少なくとも 5.0.0 で GCC に切り替えます。 CLion でコンパイラーを変更する詳細については、この 手順を参照してください。

      サニタイザーズ​​​​​​​​​​ ビューでは、ソースコードに戻ることができ、警告データをクリップボードにコピーすることもできます。

      Sanitizers ビューアクション

      視覚的表現のチェックボックスがオフになっている場合、またはコンパイラーが要件を満たしていない場合、サニタイザーの出力はプレーンテキストで表示されます。

      CLion Sanitizers プレーン出力

llvm-symbolizer へのパスを提供する

Sanitizers がアドレスをソースコードの場所に変換してスタックトレースを理解しやすくするためには、 PATH または *SAN_SYMBOLIZER_PATH 環境変数に llvm-symbolizer(英語) の場所が含まれていることを確認してください。

次のいずれかのオプションを使用します。

  • llvm-symbolizer ディレクトリへのパス (たとえば、 /usr/bin/ ) を システム PATH に追加します。

  • 実行 / デバッグ構成の 環境変数フィールドに、特定のバイナリを指す *SAN_SYMBOLIZER_PATH を追加します ( /usr/bin/llvm-symbolizer など)。

Clang コンパイラーを使用している場合、 PATH または *SAN_SYMBOLIZER_PATH 変数が llvm-symbolizer を指していない場合は、CLion から通知を受け取ります。

cl_sanitizer_symbolizerwarning.png

AddressSanitizer

AddressSanitizer (ASan)(英語) はメモリ破損ディテクターで、次の種類のバグを検出できます。

  • ヒープ、スタック、グローバルバッファオーバーフロー

  • 解放後使用 (ダングリングポインターの間接参照)

  • スコープ後使用 -fsanitize-address-use-after-scope

  • return 後使用 (detect_stack_use_after_return=1ASAN_OPTIONS に渡す)

  • 二重解放、不正な解放

  • 初期化の順序のバグ

例として、次のコードフラグメントを考えます。

int global_array[100] = {-1}; int main(int argc, char **argv) { return global_array[argc + 100]; // global buffer overflow }

-fsanitize=address -fno-omit-frame-pointer -O1 フラグを使用して構築した場合、AddressSanitizer によって グローバルバッファオーバーフローが検出されたため、このプログラムはゼロ以外のコードで終了します。

AddressSanitizer

ASan は最初に検出されたエラーで停止することに メモ てください。 この動作を変更し、最初のエラーを報告した後も ASan を実行し続けるには、 -fsanitize-recover=address をコンパイラーフラグに追加し、 halt_on_error=falseASAN_OPTIONS に追加します。

Windows で AddressSanitizer を構成する

Windows では、 clang-cl コンパイラーを使用して MSVC ツールチェーンで AddressSanitizer を操作できます。

  1. Visual Studio インストーラー を実行し、 C++ アドレスサニタイザー コンポーネントをインストールしてください。 C++ を使用したデスクトップ開発 ノードにあります。

    Visual Studio インストーラーで AddressSanitizer を選択する
  2. CLion で、 設定 | ビルド、実行、デプロイ | ツールチェーン に移動して、新しい Visual Studio ツールチェーンを作成するか、既存のツールチェーンを編集します。

    • アーキテクチャーx86_amd64 に設定します。

    • C コンパイラー フィールドと C++ コンパイラー フィールドでパスを clang-cl に設定します。

      clang-cl は、 LLVM ディストリビューション(英語)または Visual Studio ツールから使用できます。 後者の場合、パスは、たとえば C:\Program Files(x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\bin\clang-cl.exe になります。

    clang-cl を使用した MSVC ツールチェーン
  3. CMakeLists.txt で、 add_executable コマンドの後に次の行を追加します(exec を実行可能ファイルの名前に置き換えます)。

    target_compile_options(exec PRIVATE -fsanitize=address) target_link_directories(exec PRIVATE "$ENV{ProgramFiles\(x86\)}/Microsoft Visual Studio/2019/Professional/VC/Tools/Llvm/x64/lib/clang/10.0.0/lib/windows") target_link_libraries(exec PRIVATE clang_rt.asan_dynamic-x86_64 clang_rt.asan_dynamic_runtime_thunk-x86_64) target_link_options(exec PRIVATE /wholearchive:clang_rt.asan_dynamic_runtime_thunk-x86_64.lib)

    必要に応じて、 ProgramFiles\(x86\)}/Microsoft Visual Studio/2019/Professional/VC/Tools/Llvm/x64/lib/clang/10.0.0/lib/windows パスを調整します。 このディレクトリには、AddressSanitizer に必要なライブラリが含まれています。

  4. 設定 | ビルド、実行、デプロイ | CMake に移動し、 リリース プロファイル を作成し、それをデフォルトとして設定します (プロファイルリストの先頭に移動します):

    CMake プロファイルをリリース
  5. プロジェクトをロードしてビルドしてみてください。 リンカエラーが発生した場合は、すべてのファイルを ProgramFiles\(x86\)}/Microsoft Visual Studio/2019/Professional/VC/Tools/Llvm/x64/lib/clang/10.0.0/lib/windows から cmake-build-release フォルダーにコピーします。

LeakSanitizer

LeakSanitizer (LSan)(英語) はメモリリークディテクターです。 スタンドアロンモードでは、この Sanitizer はコンパイラー計測を必要としないランタイムツールです。 ただし、LSan は AddressSanitizer にも統合されているため、組み合わせてメモリエラーとリーク検出の両方を取得できます。

AddressSanitizer の一部として LeakSanitizer を有効にするには、 detect_leaks=1ASAN_OPTIONS 変数に渡します。 リーク検出なしで ASAN 計測プログラムを実行するには、 detect_leaks=0 を設定します。

LSan のみを実行する(そして ASan の減速を避ける)には、 -fsanitize=address の代わりに -fsanitize=leak を使用します。

次のコードは、ヒープに割り当てられたオブジェクトを削除しないためにメモリリークを引き起こします。

int main(){ int *x = new int(10); return 0; }

LSan は問題を検出して報告します。

LeakSanitizer

ThreadSanitizer

ThreadSanitizer (TSan)(英語) はデータ競合ディテクターです。 データ競合は、複数のスレッドが同期なしで同じメモリにアクセスし、少なくとも 1 つのアクセスが書き込みである場合に発生します。

データレースを生成する次のコードを参照してください。

#include <pthread.h> #include <stdio.h> int Global; void *Thread1(void *x) { Global++; return NULL; } void *Thread2(void *x) { Global--; return NULL; } int main() { pthread_t t[2]; pthread_create(&t[0], NULL, Thread1, NULL); pthread_create(&t[1], NULL, Thread2, NULL); pthread_join(t[0], NULL); pthread_join(t[1], NULL); }

-fsanitize=thread -fPIE -pie -g でコンパイルされたこのプログラムを実行すると、TSan はデータ競合のレポートを出力します。 出力形式の詳細については、「ThreadSanitizerReportFormat(英語) 」を参照してください。

ThreadSanitizer

UndefinedBehaviourSanitizer

UndefinedBehaviorSanitizer (UBSan) は未定義動作のランタイムチェッカーです。未定義動作は、ゼロ除算、ヌルポインターの参照、または初期化されていない非静的変数の使用など、セマンティクスが未定義な操作の結果です。

UBSan はさまざまな種類の未定義動作を検出します。詳細は clang.llvm.org でご確認ください。 各チェックは個別に有効化することも、 -fsanitize=undefined-fsanitize=integer 、および -fsanitize=nullability のチェックグループ用フラグで有効化することもできます。

下のコードは、シフト操作の定義されていない結果の状況を示しています。

int main() { int i = 2048; i <<= 28; return 0; }

このコードを -fsanitize=undefined フラグ(または -fsanitize=shift を使用)でコンパイルして起動すると、UBSan の警告にもかかわらずプログラムは正常に終了します。

UndefinedBehaviorSanitizer

UBSan の診断プログラムを終了するには、 -fno-sanitize-recover オプションを使用します。

MemorySanitizer

MemorySanitizer (MSan)(英語) は、初期化されていないメモリ読み取りのディテクターです。 この Sanitizer は、スタックまたはヒープに割り当てられたメモリが書き込まれる前に読み込まれる場合を検出します。 MSan は、ビットフィールド内の初期化されていないビットも追跡することができます。

MSan は、初期化されていない値の起点を作成日時まで追跡し、この情報を報告することができます。 この機能を有効にするには、 -fsanitize-memory-track-origins フラグを渡します。

MSan を効率的に使用するには、プログラムを -fsanitize=memory -fPIE -pie -fno-omit-frame-pointer -g でコンパイルし、 -fno-optimize-sibling-calls-O1 以降を追加してください。

初期化されていない読み取りと対応する MSan の出力を以下に示します。

int main(int argc, char** argv) { int* a = new int[10]; a[5] = 0; if (a[argc]) std::cout << a[3]; return 0; }
MemorySanitizer
2026 年 7 月 15 日