【だぶるふりー】
ダブルフリー とは?
最終更新:
💡 解放済みのメモリを、もう一度解放してしまう
動的に確保した同じメモリ領域を、解放したあとに再び解放してしまうバグ。プログラムの停止やメモリ管理情報の破損につながり、条件によっては攻撃に悪用される。
📌 このページのポイント
- 同じ確保に対して解放処理を重ねてしまうバグ
- 異なるポインタが同じ領域を指していても起こり得る
- 停止やメモリ破損、条件によっては任意コード実行につながる
- 解放の責任を明確にし、静的解析や実行時検査で確認する
ダブルフリーって、同じメモリを2回解放するってこと?
そうだよ。たとえばmalloc()で確保した領域をfree()で解放したあと、再び同じ領域をfree()に渡してしまうバグだね。解放は、使い終わった領域を再利用できるようにする操作なんだ。
どうして2回呼んでしまうの?
エラー時の後片付けと通常の後片付けで同じ領域を解放したり、別々の処理がそれぞれ解放の責任を持つと思い込んだりすると起こるよ。変数名が違っても、同じ確保領域を指すポインタなら二重解放になり得るんだ。
2回目で必ずヒープの台帳が壊れるの?
解放後に使うバグとは違うの?
Use-After-Freeは、解放した領域をあとから読み書きするバグだよ。ダブルフリーは、解放処理をもう一度行うバグ。どちらも領域の寿命の管理に関係するけれど、問題になる操作が違うんだ。
NULLにすれば防げる?
free()のあと、そのポインタをNULLにするのは対策の一つだよ。free(NULL)は何もしない。ただし別の変数にコピーしたポインタまでは変わらないので、誰が一度だけ解放するかを決めることも大切。AddressSanitizerを使った実行時検査や静的解析も役立つよ。
まとめ:ざっくりこれだけ覚えればOK!
「ダブルフリー」って出てきたら「同じメモリを二重に解放してしまうバグ」と思えばだいたいOK!
📖 おまけ:英語の意味
「Double Free」 = 二重解放
💬 Freeはここではメモリを解放すること。すでに解放した領域を、もう一度解放してしまうという意味だよ。