【ダングリングポインタ】
ダングリングポインタ とは?
最終更新:
💡 宛先のデータがなくなった、古い参照先
指していたデータの寿命が終わり、そのデータを有効に参照できなくなったポインタ。動的メモリの解放や、局所変数の寿命の終了などで生じる。C/C++でそのデータへアクセスすると未定義動作となり、不具合や脆弱性の原因になり得る。
📌 このページのポイント
- 動的メモリの解放だけでなく、指すデータの寿命の終了でも生じる
- 解放後のアクセスはUse-After-Freeで、未定義動作や脆弱性につながり得る
- 一つのポインタをNULLへ変えても、同じ領域を指すコピーは残る
- 所有権・寿命・別の参照を管理し、言語の安全性にも適用範囲がある
ダングリングポインタって、どういうもの?
メモリの解放後も、そのデータを指していたポインタが残る場合などだよ。関数内の局所変数を指すものを外へ返し、変数の寿命が終わる例もある。住所の数字が残っていても、そこに元のデータが有効に存在するとは限らないんだ。
アクセスしたら、必ずクラッシュする?
C/C++では、寿命が終わったデータへのアクセスは未定義動作になる。クラッシュやデータ破壊が起きる場合も、一見動く場合もあるよ。解放後のアクセスはUse-After-Freeとして、条件によって攻撃に悪用されることもある。必ず決まった症状になるわけではないんだ。
ポインタをNULLにすれば解決する?
その変数をNULLへ変える対策はあるけれど、同じ領域を指す別のポインタまで変わらないよ。NULLを参照しても未定義動作で、必ず安全にクラッシュする保証ではない。解放後に使わない設計と、ほかに参照している箇所の確認が必要なんだ。
どうやって防ぐの?
最後の使用より先に解放しないこと、誰がデータを持ち、いつまで参照できるかを管理することが基本だよ。解放済みの値を読まず、所有者と借りた参照の寿命を合わせる。ポインタを一つずつ直すだけで、全ての参照の寿命を解決したと思わないことが大切なんだ。
Rustなら、どんなポインタでも安全なの?
通常の参照については、借りたデータより参照が長生きしないようコンパイラが検査するよ。ただしraw pointerの参照先の有効性までは自動保証しない。unsafeや外部言語との境界では、その条件を実装側が守る必要がある。言語名だけで全てのコードが安全とは言えないんだ。
まとめ:ざっくりこれだけ覚えればOK!
「ダングリングポインタ」って出てきたら「寿命が終わったデータを指す、有効でないポインタ」と思えばだいたいOK!
📖 おまけ:英語の意味
「Dangling Pointer」 = 宙ぶらりんのポインタ
💬 Danglingはぶら下がる、宙ぶらりんという意味。指していたデータがもう有効でない参照先を表すよ。