【ダングリングポインタ】

ダングリングポインタ とは?

最終更新:
💡 宛先のデータがなくなった、古い参照先

指していたデータの寿命が終わり、そのデータを有効に参照できなくなったポインタ。動的メモリの解放や、局所変数の寿命の終了などで生じる。C/C++でそのデータへアクセスすると未定義動作となり、不具合や脆弱性の原因になり得る。

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

参考資料

← 用語集にもどる