Valgrindの基礎
リークとエラーを検出します
「Valgrindの基礎」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
Valgrind とは
Valgrind は計測フレームワークです。標準ツールの Memcheck は、再コンパイルせずに合成 CPU 上でプログラムを実行し、メモリリークやメモリエラーを検出します。
Memcheck を実行する
プログラムの前に Valgrind を指定して実行します。行番号を表示できるように、先に -g を付けてビルドしてください。
g++ -g main.cpp -o app
valgrind --leak-check=full ./appリークを検出する
Memcheck は終了時にも確保されたままのメモリーを報告し、それを確実に失われたもの、間接的に失われたもの、到達可能なものに分類します。
#include <cstdlib>
int main() {
int* p = (int*)malloc(40); // never freed -> definitely lost
return 0;
}リークの分類
レポートの分類を理解しましょう。
- Definitely lost:ポインターが残っておらず、実際のリークです
- Indirectly lost:失われたブロック経由でしか到達できません
- Still reachable:終了時にもポインターが存在します(多くの場合は問題ありません)
無効な読み取りと書き込み
Memcheck は、確保されていないメモリーや解放済みメモリーへのアクセスを検出し、アドレスとサイズを報告します。
#include <cstdlib>
int main() {
int* a = (int*)malloc(2 * sizeof(int));
a[5] = 1; // invalid write past the block
free(a);
return 0;
}未初期化値
Memcheck は、条件分岐や出力が未初期化値に依存している場合に警告します。これは非決定的なバグの一般的な原因です。
#include <iostream>
int main() {
int x; // uninitialized
if (x == 42) // use of uninitialized value
std::cout << "hi\n";
return 0;
}出力の読み方
各エラーブロックには、操作内容、不正なアクセスのスタックトレース、ヒープブロックの場合はメモリーが確保された場所が示されます。HEAP SUMMARY には確保とリークの合計が表示されます。
便利なフラグ
よく使うオプション:
--leak-check=full:各リークの詳細を表示します--show-leak-kinds=all--track-origins=yes:未初期化値を発生源まで追跡します--error-exitcode=1:エラーがあると CI を失敗させます
Valgrind と ASan の比較
どちらもメモリーバグを検出できますが、それぞれにトレードオフがあります。
- Valgrind:再コンパイル不要で、動作は遅く(10~50倍)、未初期化読み取りの検出に優れています
- ASan:再コンパイルが必要ですが、はるかに高速で、スタックオーバーフローの検出に優れています
既知の問題を抑制する
サードパーティーライブラリがノイズとなる報告を出すことがあります。--gen-suppressions=all で抑制ファイルを生成し、--suppressions=file で適用すると、既知で問題のない報告を非表示にできます。
Valgrind を使う場面
サニタイザー付きで再コンパイルできない場合、未初期化値を正確に追跡する必要がある場合、または別の観点から確認したい場合は Valgrind を使いましょう。それ以外では、通常の CI には ASan のほうが速く、適していることが多いです。
クイックチェック
リークの分類を思い出してください。
まとめ
Valgrind の基本を学びました。
- Memcheck はリーク、不正なアクセス、未初期化値の読み取りを検出し、再コンパイルは不要です
--leak-check=full --track-origins=yesを付けて実行します- リークの種類には、確実に失われたもの、間接的に失われたもの、到達可能なものがあります
- ASan より遅い一方、未初期化値に関するバグの検出に優れています
AI チューターと学ぶ C++ — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「Valgrindの基礎」レッスンは無料ですか?
はい。「Valgrindの基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「Valgrindの基礎」で何を学びますか?
リークとエラーを検出します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「Valgrindの基礎」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- gdbとlldbの使用
- AddressSanitizer
- UBSanとTSan
- Valgrindの基礎