Valgrindは、数種類の動的解析ツールを集めたフレームワークです。今回は、その中で不正なメモリアクセスやメモリリークを検出するツールを使います。なお、便宜上、これをValgrindと呼びます。
Valgrindで全てのバグを検出できるわけではありませんが、デバッグ時のうっかりミスを見つけられます。参考文献[1]によると、本ツールでは、以下のメモリ関連のバグを検出できるそうです。
いずれも、うっかり作り込んでしまうけれども、見つけるのが難しいバグばかりですね。今回は、特にメモリリークに着目します。メモリリークは、確保したメモリを解放し忘れた時に発生します。リスト1の例題で考えます。
#include<stdlib.h> int main(){ char *str; str = (char*)malloc(100); return 0; }
リスト1は、malloc関数で100バイト分を動的確保したプログラムの例です。3行目で、char型の*strを宣言し、4行目でmalloc関数を使って100バイト分だけメモリを確保しています。一通り見ると、メモリ解放を指示するfree関数がなく、メモリリークが起きています。例題プログラムなら何の問題もありませんが、規模が大きいプログラムでは、バグの温床になります。
Valgrindを実行すると、メモリリークを自動的に検出できます。図13を見てください。
下から5行目の「definitely lost: 100 bytes in 1 blocks」というメッセージがありますね。これは、メモリリークを起こしている際に出るメッセージです。Valgrindでは、このようにメモリリークを検出できます。mallocを使う場合は、free関数を使うことを徹底しましょう。「free(str);」を追加すると、エラーメッセージはなくなります。
今回の内容を簡単にまとめます。
今回は、メモリリークなどのメモリ関連のバグを検出するValgrindの環境構築と、使い方を紹介しました。メモリリークは常習犯的なバグですが、見逃してしまうことも少なくありません。Valgrindを使用すると、メモリリークを自動的に検出できますので、デバッグ時に大変重宝します。ただし、ツールへの過度の期待は禁物。どんなツールや技法にも制限事項が存在します。メモリリークについて詳しく知りたい方は、以下の書籍を参照してください。
次回も引き続き、Valgrindを取り上げます。
[1]「モダンC言語プログラミング」(花井志生、2013、KADOKAWA/アスキーメディアワークス)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.