0Pricing
C++ Academy · レッスン

Sanitizer:Address、Thread、UB Sanitizer

Sanitizerファミリーで、メモリ、スレッド、未定義動作に関するバグを見つけます。

「Sanitizer:Address、Thread、UB Sanitizer」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

ランタイムチェッカー

サニタイザーは、Clang と GCC に組み込まれた、コンパイル時に計装されるランタイムチェッカーです。型システムでは検出できないバグを見つけます。

AddressSanitizer(ASan)

メモリエラー、つまりバッファーオーバーフロー、解放後使用、二重解放、リークを検出します。実行速度は約 2 倍遅くなります。

g++ -fsanitize=address -g -O1 main.cpp
./a.out

ASan の出力例

ASan がバグを検出すると、正確な行番号とエラーの種類を含むスタックトレースを出力します。

==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 4 at 0x60200000001c
    #0 0x... in main main.cpp:12

ThreadSanitizer(TSan)

データ競合やその他の並行処理のバグを検出します。実行速度は約 5~15 倍遅くなります。

g++ -fsanitize=thread -g main.cpp
./a.out
# Reports concurrent unprotected accesses

Undefined Behavior Sanitizer(UBSan)

符号付き整数のオーバーフロー、null ポインターのデリファレンス、アラインメント違反のアクセス、ゼロ除算などを検出します。

g++ -fsanitize=undefined -g main.cpp

MemorySanitizer(MSan)

未初期化メモリの読み取りを検出します。Clang 専用です。ライブラリを含むプログラム全体を MSan 対応でビルドする必要があります。

LeakSanitizer

Linux では ASan に同梱されています。終了時にも割り当てられたままのメモリを報告します。

ASAN_OPTIONS=detect_leaks=1 ./a.out

サニタイザーは無料ではありません

すべてのサニタイザーはプログラムの実行を遅くし、より多くのメモリを使用します。開発環境と CI で使用し、本番リリースには含めないでください。

すべてを組み合わせることはできない

ASan、TSan、MSan はメモリへの計装方法が異なるため、相互に併用できません。UBSan は他のサニタイザーと組み合わせられます。

コンパイラーのサポート

GCC は ASan、TSan、UBSan をサポートします。Clang はこれらすべてに加えて MSan もサポートします。フラグはコンパイラー間で同じです。

CI への統合

CI で各サニタイザーを使ってテストスイートを実行します。リリース前に競合状態やメモリバグを検出できます。最高の網羅性を得るには、ファジングと組み合わせます。

ヒント:-O1 でビルドする

サニタイザー用にビルドするときは、少なくとも -O1 で最適化します。-O0 でも動作しますが、インライン化が少なくなるため、スタックトレースの情報量が減ります。

抑制ファイル

既知の誤検出やサードパーティーの問題については、抑制ファイルを作成し、サニタイザーに無視するよう指示します。

ASAN_OPTIONS="suppressions=asan.supp" ./a.out

確認問題

スレッド間のデータ競合を検出するサニタイザーはどれですか。

まとめ

サニタイザーは実際のランタイムバグを検出します。AddressSanitizer はメモリエラー、ThreadSanitizer は競合、UBSan は未定義動作、MSan は未初期化メモリの読み取りを検出します。CI でテストスイートと組み合わせると、安全性を大きく高められます。

よくある質問

「Sanitizer:Address、Thread、UB Sanitizer」レッスンは無料ですか?

はい。「Sanitizer:Address、Thread、UB Sanitizer」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「Sanitizer:Address、Thread、UB Sanitizer」で何を学びますか?

Sanitizerファミリーで、メモリ、スレッド、未定義動作に関するバグを見つけます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Sanitizer:Address、Thread、UB Sanitizer」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 静的解析ツール:clang-tidy、cppcheck
  2. Sanitizer:Address、Thread、UB Sanitizer
  3. libFuzzerによるファジング
  4. C++プロジェクトの継続的インテグレーション
← C++ Academyに戻る