タダでソフト開発の生産性と品質を上げる方法(8):メモリリークを一瞬で見つける「Valgrind」(その1)山浦恒央の“くみこみ”な話(98)(3/3 ページ)

» 2017年08月28日 10時00分 公開
前のページへ 1|2|3       

4.Valgrindの概要

 Valgrindは、数種類の動的解析ツールを集めたフレームワークです。今回は、その中で不正なメモリアクセスやメモリリークを検出するツールを使います。なお、便宜上、これをValgrindと呼びます。

 Valgrindで全てのバグを検出できるわけではありませんが、デバッグ時のうっかりミスを見つけられます。参考文献[1]によると、本ツールでは、以下のメモリ関連のバグを検出できるそうです。

  • 初期化していない変数
  • 領域外の読み出し
  • メモリリーク
  • メモリ操作関数の間違った呼び出し

 いずれも、うっかり作り込んでしまうけれども、見つけるのが難しいバグばかりですね。今回は、特にメモリリークに着目します。メモリリークは、確保したメモリを解放し忘れた時に発生します。リスト1の例題で考えます。

#include<stdlib.h>
int main(){
	char *str;
	str = (char*)malloc(100);
	return 0;
}
リスト1 メモリリークの例

 リスト1は、malloc関数で100バイト分を動的確保したプログラムの例です。3行目で、char型の*strを宣言し、4行目でmalloc関数を使って100バイト分だけメモリを確保しています。一通り見ると、メモリ解放を指示するfree関数がなく、メモリリークが起きています。例題プログラムなら何の問題もありませんが、規模が大きいプログラムでは、バグの温床になります。

 Valgrindを実行すると、メモリリークを自動的に検出できます。図13を見てください。

図13 図13 実行結果

 下から5行目の「definitely lost: 100 bytes in 1 blocks」というメッセージがありますね。これは、メモリリークを起こしている際に出るメッセージです。Valgrindでは、このようにメモリリークを検出できます。mallocを使う場合は、free関数を使うことを徹底しましょう。「free(str);」を追加すると、エラーメッセージはなくなります。

4.まとめ

 今回の内容を簡単にまとめます。

  • メモリリークは、常習犯的なバグである。簡単に作り込むのに、検出が面倒
  • Valgrindは、メモリ関連するバグを検出するツールをまとめたものである
  • Valgrindを使用すると、メモリリークを検出し、ログメッセージで確認できる

5.終わりに

 今回は、メモリリークなどのメモリ関連のバグを検出するValgrindの環境構築と、使い方を紹介しました。メモリリークは常習犯的なバグですが、見逃してしまうことも少なくありません。Valgrindを使用すると、メモリリークを自動的に検出できますので、デバッグ時に大変重宝します。ただし、ツールへの過度の期待は禁物。どんなツールや技法にも制限事項が存在します。メモリリークについて詳しく知りたい方は、以下の書籍を参照してください。

  • 「ゲームエンジンアーキテクチャ 第2版」(ジェイソン・グレゴリー他、2015、ソフトバンククリエイティブ)
  • 「デバッグの理論と実践 なぜプログラムはうまく動かないのか」(Andreas Zeller他、2012、オライリージャパン)
  • 「ガベージコレクション 自動的メモリ管理を構成する理論と実装」(リチャード・ジョーンズ他、2016、翔泳社)

 次回も引き続き、Valgrindを取り上げます。

参考文献

[1]「モダンC言語プログラミング」(花井志生、2013、KADOKAWA/アスキーメディアワークス)


【 筆者紹介 】
山浦 恒央(やまうら つねお)

東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)


1977年、日立ソフトウェアエンジニアリングに入社、2006年より、東海大学情報理工学部ソフトウェア開発工学科助教授、2007年より、同大学大学院組込み技術研究科准教授、2016年より非常勤講師。

主な著書・訳書は、「Advances in Computers」 (Academic Press社、共著)、「ピープルウエア 第2版」「ソフトウェアテスト技法」「実践的プログラムテスト入門」「デスマーチ 第2版」「ソフトウエア開発プロフェッショナル」(以上、日経BP社、共訳)、「ソフトウエア開発 55の真実と10のウソ」「初めて学ぶソフトウエアメトリクス」(以上、日経BP社、翻訳)。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.