タダでソフト開発の生産性と品質を上げる方法(9):メモリリークを一瞬で見つける「Valgrind」(その2):山浦恒央の“くみこみ”な話(99)(3/3 ページ)
「タダでソフト開発の生産性と品質を上げる方法」の第9回。前回紹介した「Valgrind」を用いた具体的なメモリリークの検出方法について解説します。
3.3 領域外書き込み
「領域外書き込み」とは、確保した領域外に値を書き込むことを言います。いわゆるメモリ破壊ですね。領域外(別の変数)に書き込むと、別変数を読み出した場合、変数値が破壊され、不可解な現象が起こる原因となります(バグの現象に規則性がないため、単純なバグながら、検出するのは非常に大変です)。リスト3で、考えてみましょう。
#include<stdlib.h> int main(){ char *str; str = (char*)malloc(5); str[5] = 'b'; free(str); return 0; }
リスト3は、char型で5バイト分をmalloc関数を使って確保しました。つまり、変数strは、0〜4番地にアクセスできます。しかし、5行目では、strが範囲外の5番地に「b」を書き込んでいます。典型的な領域外アクセスですね。valgrindを実行すると、図3のようなエラーメッセージが出ます。
3行目に「Invalid write of size 1」と出ており、「1バイト誤って書き込んでいます」の意味です。例えば、5行目を「str[4] = 'b';」に変更すると、Valgrindのエラーメッセージはなくなります。
リスト2、3のように短い例題では、メモリのアクセス例外はすぐに発見できますが、扱う範囲が増えると、分かりにくくなります。Valgrindをデバッグ時に使用し、見つけにくいバグを機械的に広範囲で検出すると、時間と労力の節約になります。
4.まとめ
今回の内容を以下にまとめます。
- Valgrindは、動的解析ツールである
- Valgrindは、未初期化変数を検出できる
- Valgrindは、領域外の読み込みや書き込みを検出できる
- Valgrindは、うっかりミスを防止上、デバッグ時に有効なツールである
5.終わりに
エンジニアは、決まった時間内に最大限の成果物を出力することが重要です。そのためには、単純作業は極力減らすべきでしょう。Valgrindは、プログラマーが見落としやすいメモリ関連のバグを瞬時に検出するツールで、デバッグ時に有効です。この類のツールは有償、無償問わず数多く出回っていますので、調べてみるといいでしょう。
参考文献
[1]「モダンC言語プログラミング」(花井志生、2013、KADOKAWA/アスキーメディアワークス社)
[2]「デバッグの理論と実践 なぜプログラムはうまく動かないのか」(Andreas Zeller他、2012、オライリージャパン)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- 組み込みソフトがこの10年で変わったこと、変わらないこと
MONOist開設10周年に合わせて、MONOistで記事を執筆していただいている方々からの特別寄稿を掲載していきます。第1弾は、間もなく連載100回を迎える「“くみこみ”な話」を執筆していただいている山浦恒央氏の寄稿です。 - タダでソフト開発の生産性と品質を上げる方法(8):メモリリークを一瞬で見つける「Valgrind」(その1)
「タダでソフト開発の生産性と品質を上げる方法」の第8回。今回は、ソフトウェアエンジニアを悩ませる常習的なバグ「メモリリーク」を簡単に検出できる「Valgrind」を紹介します。 - タダでソフト開発の生産性と品質を上げる方法(7):高機能な単体テストツール「GoogleTest」を使いこなす(その2)
「タダでソフト開発の生産性と品質を上げる方法」の第7回。グーグル(Google)製の単体テストフレームワーク「GoogleTest」の高度な機能のうち、今回は「パスカバレッジ」を取り上げます。 - タダでソフト開発の生産性と品質を上げる方法(6):高機能な単体テストツール「GoogleTest」を使いこなす(その1)
「タダでソフト開発の生産性と品質を上げる方法」の第6回。前回紹介したグーグル(Google)製の単体テストフレームワーク「GoogleTest」には高度な機能がありますが、今回は「アサーションマクロ」と「テストフィクスチャの使い方」を取り上げます。 - タダでソフト開発の生産性と品質を上げる方法(5):グーグルの隠し球的単体テストツール「GoogleTest」
「タダでソフト開発の生産性と品質を上げる方法」の第5回。今回は、IT業界の巨人、グーグル(Google)製の単体テストフレームワーク「GoogleTest」を紹介する。