ソフトウェアの脆弱性の1つで、すでに解放を行ってあるメモリ領域に対して、誤ってもう1度解放処理を実行してしまうことを指します。
すでに解放されているメモリ領域であることを判断して回避するようになっていないかぎり、解放済みのメモリ領域に対する解放処理は、メモリ破壊につながります。メモリマネージャによって管理されている情報が破壊される場合もあるため、二重解放が生み出す結果は、管理の詳細を熟知していないかぎり簡単にイメージできるものではありません。たまたま問題なく動いているかのようにみえてしまうケースもあります。
C言語では、malloc関数などを使って動的に確保したメモリ領域は、最終的に free関数の呼び出しによって解放しますが、適切に free関数を呼び出して解放を終えたあと、再び同じメモリ領域を対象にした free関数の呼び出しを行うことで、二重解放となります。
C言語の場合、解放済みのメモリ領域に対する free関数の呼び出しは未定義の動作とされています。[1]
malloc関数や free関数の使い方や、不完全ながらも二重解放を対策する方法について、C言語編第35章で解説しています。
「多重解放」と表現する場合もあり、繰り返しの解放によって問題が重症化していく場合もありますが、通常2回目の解放の時点ですでに重大な問題となるので、「二重解放」と呼ぶことが多いです。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |