AddressSanitizer
メモリエラーを検出します
「AddressSanitizer」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
AddressSanitizer とは
AddressSanitizer(ASan)は、実行時にメモリエラーを検出するコンパイラーベースのツールです。範囲外アクセス、解放後使用、二重解放、メモリリークを検出でき、日常的なテストにも十分な速度で動作します。
ASan を有効にする
コンパイル時とリンク時の両方で -fsanitize=address を追加し、読みやすいレポートを得るために -g も付けてください。
g++ -fsanitize=address -g -O1 main.cpp -o app
./appヒープバッファーオーバーフロー
ASan は、確保したバッファーの範囲を超えた読み書きを検出します。このプログラムは要素を1つ多く書き込んでいます。
#include <cstdlib>
int main() {
int* a = (int*)malloc(3 * sizeof(int));
a[3] = 7; // out of bounds
free(a);
return 0;
}解放後使用
解放後のメモリーにアクセスすることは未定義動作です。ASan は、解放と確保のスタックトレースを含む heap-use-after-free を報告します。
#include <cstdlib>
int main() {
int* p = (int*)malloc(sizeof(int));
free(p);
*p = 5; // use after free
return 0;
}スタックバッファーオーバーフロー
ASan はスタック上の配列も計測し、ローカルバッファーの範囲外アクセスを検出します。
#include <iostream>
int main() {
int buf[3] = {0, 0, 0};
for (int i = 0; i <= 3; ++i) buf[i] = i; // i==3 overflows
std::cout << buf[0] << "\n";
return 0;
}レポートの読み方
ASan のレポートには、エラーの種類、障害が発生したアドレス、不正なアクセスと関連する確保・解放処理のスタックトレースが示されます。通常、最初のスタックフレームがバグの場所を直接指しています。
リーク検出
多くのプラットフォームでは、ASan に LeakSanitizer が含まれています。プログラム終了時まで解放されなかったメモリーを、確保時のスタックとともに報告します。
#include <cstdlib>
int main() {
int* leaked = (int*)malloc(100); // never freed
return 0;
}実行時オプション
ASAN_OPTIONS 環境変数で動作を調整できます。例:ASAN_OPTIONS=detect_leaks=1:halt_on_error=0
パフォーマンスへの影響
ASan を有効にすると、通常はプログラムが約2倍遅くなり、メモリー使用量も増加します。テストや CI では許容できますが、有効にしたままリリースビルドを出荷することはありません。
テストと組み合わせる
CI でユニットテストを ASan 上で実行してください。サニタイザーを有効にしたテストで初めて見つかる実際のバグも数多くあります。専用のサニタイザービルド構成を用意しておきましょう。
注意深さの代わりにはならない
ASan がバグを検出できるのは、実際に実行したコードパスだけです。十分なテストカバレッジと組み合わせてください。実行されていないバグのある分岐は、見つからないまま残ります。
クイックチェック
ASan を有効にする方法を思い出してください。
まとめ
AddressSanitizer について学びました。
- 範囲外アクセス、解放後使用、二重解放、メモリリークを検出します
-fsanitize=address -gで有効にします- レポートにはエラーの種類と、確保・解放処理のスタックが示されます
- 約2倍遅くなりますが、テストや CI に最適で、リリースには向きません
よくある質問
「AddressSanitizer」レッスンは無料ですか?
はい。「AddressSanitizer」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「AddressSanitizer」で何を学びますか?
メモリエラーを検出します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「AddressSanitizer」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- gdbとlldbの使用
- AddressSanitizer
- UBSanとTSan
- Valgrindの基礎