Valgrind: メモリリーク検出

malloc/free の対応を確認。リークを特定。

Valgrind
メモリエラー検出ツール。
メモリリーク
解放されないメモリ。
ASan
Address Sanitizer。高速。

Valgrind

Leak Detection
# Valgrind の使用
# コンパイル(-g オプション必須)
gcc -g -O0 main.c -o main
# メモリリーク検出
valgrind --leak-check=full ./main
# 出力例
==1234== HEAP SUMMARY:
==1234== total heap usage: 10 allocs, 8 frees
==1234== definitely lost: 100 bytes in 2 blocks
==1234== indirectly lost: 0 bytes
==1234== possibly lost: 0 bytes
==1234== still reachable: 0 bytes
# エラー種別
# - definitely lost: 確実なリーク
# - indirectly lost: リークしたポインタ経由で参照不可
# - possibly lost: 循環参照などの可能性
# - still reachable: 終了時に到達可能(通常は問題なし)
Bad
// ❌ Bad: リークに気づかない
int* p = malloc(100);
p = malloc(200); // 最初の100がリーク
Good
Terminal window
// Good: Valgrind で検出
// $ valgrind ./program
// ==1234== 100 bytes definitely lost

パターン

Options, Tools, ASan
# よく使うオプション
# すべてのリークを表示
valgrind --leak-check=full --show-leak-kinds=all ./main
# リークの発生箇所を追跡
valgrind --leak-check=full --track-origins=yes ./main
# 子プロセスも追跡
valgrind --trace-children=yes ./main
# ログファイルに出力
valgrind --log-file=valgrind.log ./main
# その他のツール
# Memcheck(デフォルト)- メモリエラー検出
valgrind --tool=memcheck ./main
# Cachegrind - キャッシュヒット率分析
valgrind --tool=cachegrind ./main
# Callgrind - 関数呼び出しプロファイリング
valgrind --tool=callgrind ./main
# 結果を表示: kcachegrind callgrind.out.*
# Address Sanitizer(代替手段)
gcc -fsanitize=address -g main.c -o main
./main # 実行時にエラーを検出
Tip: CI/CD に Valgrind を組み込む。

合格ライン

Valgrind でリークを検出できる
出力を読み解ける