エラーの例:メモリリーク
メモリリークとは、メモリ ブロックを指すポインタが失われたために、動的に割り当てられたメモリ ブロックが解放できなくなった状態のことです。修正後の“Hello world”プログラムを実行して次の引数を渡すと、メモリ リークが発生します。
例(アドレスの上書きによるリーク)
図Aは、変数 string_so_farと変数 string によって割り当てられたメモリブロックの状態を示しています。
例(アドレスの上書きによるリーク)
図Aは、変数 string_so_farと変数 string によって割り当てられたメモリブロックの状態を示しています。
変数 string_so_far | 文字列“hello”を指しています |
変数 string | 文字列“hello this”を指しています |
図A
ソース内で、以下のようなステートメントを設定した場合、
string_so_far = string;
図Bのように、両方の変数が hello this\0 のメモリブロックを指します。すると、hello\0 を指すポインタがなくなってしまい、string_so_far 変数が指していたこのメモリブロックは、永遠に確保されたままになってしまいます。つまり、メモリリークが発生します。
string_so_far = string;
図Bのように、両方の変数が hello this\0 のメモリブロックを指します。すると、hello\0 を指すポインタがなくなってしまい、string_so_far 変数が指していたこのメモリブロックは、永遠に確保されたままになってしまいます。つまり、メモリリークが発生します。
図B
図Cは、Insure++が上記のメモリリークを検出した状態です。Insure++は、何が原因でメモリリークが発生したのか、発生したメモリブロックのアドレス、変数名、ソースコードのファイル名、行番号、ステートメント、スタックトレースなど、修正に役立つ情報をレポートします。Insure++のレポートから、アドレスの上書き、つまりメモリの割り当てが原因でメモリリークが発生していることがわかります。
- メモリリークの種類
Insure++は、メモリリークの発生原因よって、4種類に分類しています。
LEAK_ASSIGN アドレスの上書きによるリーク
このエラーが発生するのは、動的に割り当てられたメモリ ブロックが解放できなくなるようなポインタの再設定が行われたときです。特に、動的割り当てブロックを指す唯一のポインタが上書きされたときに、このエラーが発生します。LEAK_FREE メモリ領域の解放にともなうリーク
解放したメモリ ブロックの中に、ほかのメモリ ブロックへのポインタが含まれている場合に発生します。LEAK_RETURN 戻り値が無視されたために発生するメモリ リーク
メモリ ブロックを指すポインタを呼び出し元に関数が返した場合に、そのポインタが呼び出し元で無視されたときに発生します。LEAK_SCOPE 自動変数の喪失にともなうリーク
あるメモリ ブロックを指すローカル変数 (ポインタ) を関数が持っている場合に、ポインタをグローバル変数に保存せずに関数が終了したとき、またはポインタを戻り値として返さずに関数が終了したときに発生します。
Insure++に
関するお問い合わせ
テクマトリックス株式会社
東京本社ソフトウェアエンジニアリング事業部
03-4405-7853
- メールでのお問い合わせ
- parasoft-info@techmatrix.co.jp