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-pointer、fsanitize-recover/fno-sanitize-recover、-fsanitize-blacklistなどの他のコンパイルフラグです。警告メッセージにファイル名と行番号を含めるには、
[-g]を使用します。適切なパフォーマンスを得るために、最適化レベル
[-OX]を追加してください(特定の Sanitizer ドキュメントの推奨事項を参照)。
CMake 以外のプロジェクト用の Sanitizers
Makefile プロジェクト または コンパイルデータベース プロジェクトで カスタムビルドターゲット を利用している場合は、コンパイラーフラグと合わせてリンカーフラグも指定してください。 例えば、Makefile と AddressSanitizer の場合:

Sanitizers 設定を調整する
に移動し、以下を設定します。

実行時フラグ
このセクションでは、各サニタイザーのランタイムオプションを指定します。 これは手動で、または 既存の環境変数からフラグをインポートする ボタンをクリックして実行できます(変数
ASAN/MSAN/LSAN/TSAN_OPTIONSが表示されている場合、このボタンが使用可能になります)。 サニタイザー共通のフラグ(英語)を参照してください。Sanitizer の出力を視覚的に表現する
このチェックボックスをオンにすると、プレビューエディターとフレーム情報でツリービューが出力されます。

視覚化された出力を利用できるようにするには、少なくとも 3.8.0 で Clang に切り替えるか、少なくとも 5.0.0 で GCC に切り替えます。 CLion でコンパイラーを変更する詳細については、この 手順を参照してください。
サニタイザーズ ビューでは、ソースコードに戻ることができ、警告データをクリップボードにコピーすることもできます。

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

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 から通知を受け取ります。

AddressSanitizer
AddressSanitizer (ASan)(英語) はメモリ破損ディテクターで、次の種類のバグを検出できます。
ヒープ、スタック、グローバルバッファオーバーフロー
解放後使用 (ダングリングポインターの間接参照)
スコープ後使用
-fsanitize-address-use-after-scopereturn 後使用 (
detect_stack_use_after_return=1をASAN_OPTIONSに渡す)二重解放、不正な解放
初期化の順序のバグ
例として、次のコードフラグメントを考えます。
-fsanitize=address -fno-omit-frame-pointer -O1 フラグを使用して構築した場合、AddressSanitizer によって グローバルバッファオーバーフローが検出されたため、このプログラムはゼロ以外のコードで終了します。

ASan は最初に検出されたエラーで停止することに メモ てください。 この動作を変更し、最初のエラーを報告した後も ASan を実行し続けるには、 -fsanitize-recover=address をコンパイラーフラグに追加し、 halt_on_error=false を ASAN_OPTIONS に追加します。
Windows で AddressSanitizer を構成する
Windows では、 clang-cl コンパイラーを使用して MSVC ツールチェーンで AddressSanitizer を操作できます。
Visual Studio インストーラー を実行し、 C++ アドレスサニタイザー コンポーネントをインストールしてください。 C++ を使用したデスクトップ開発 ノードにあります。

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 になります。

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 に必要なライブラリが含まれています。
に移動し、 リリース プロファイル を作成し、それをデフォルトとして設定します (プロファイルリストの先頭に移動します):

プロジェクトをロードしてビルドしてみてください。 リンカエラーが発生した場合は、すべてのファイルを 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=1 を ASAN_OPTIONS 変数に渡します。 リーク検出なしで ASAN 計測プログラムを実行するには、 detect_leaks=0 を設定します。
LSan のみを実行する(そして ASan の減速を避ける)には、 -fsanitize=address の代わりに -fsanitize=leak を使用します。
次のコードは、ヒープに割り当てられたオブジェクトを削除しないためにメモリリークを引き起こします。
LSan は問題を検出して報告します。

ThreadSanitizer
ThreadSanitizer (TSan)(英語) はデータ競合ディテクターです。 データ競合は、複数のスレッドが同期なしで同じメモリにアクセスし、少なくとも 1 つのアクセスが書き込みである場合に発生します。
データレースを生成する次のコードを参照してください。
-fsanitize=thread -fPIE -pie -g でコンパイルされたこのプログラムを実行すると、TSan はデータ競合のレポートを出力します。 出力形式の詳細については、「ThreadSanitizerReportFormat(英語) 」を参照してください。

UndefinedBehaviourSanitizer
UndefinedBehaviorSanitizer (UBSan) は未定義動作のランタイムチェッカーです。未定義動作は、ゼロ除算、ヌルポインターの参照、または初期化されていない非静的変数の使用など、セマンティクスが未定義な操作の結果です。
UBSan はさまざまな種類の未定義動作を検出します。詳細は clang.llvm.org でご確認ください。 各チェックは個別に有効化することも、 -fsanitize=undefined、 -fsanitize=integer 、および -fsanitize=nullability のチェックグループ用フラグで有効化することもできます。
下のコードは、シフト操作の定義されていない結果の状況を示しています。
このコードを -fsanitize=undefined フラグ(または -fsanitize=shift を使用)でコンパイルして起動すると、UBSan の警告にもかかわらずプログラムは正常に終了します。

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 の出力を以下に示します。
