C++ Academy · レッスン

Valgrindの基礎

リークとエラーを検出します

レッスン 4/413 ステップ

「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フィードバックを取得できます。ローカル設定は不要です。

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

  1. gdbとlldbの使用
  2. AddressSanitizer
  3. UBSanとTSan
  4. Valgrindの基礎
← C++ Academyに戻る