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

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

💡 引っ越した友達の家に手紙を送り続ける、迷子の宛先
📌 このページのポイント
ダングリングポインタの危険性 ① 正常な状態 ポインタ ptr データ(有効) ✓ 安全にアクセスできる ② free() でメモリ解放 ポインタ ptr 解放済み領域 ⚠ ptrはまだ古いアドレスを保持 ③ 解放後にアクセス(危険!) ptr 別のデータが 再配置済み × クラッシュ(セグフォ) × データ破壊(静かに壊れる) × 任意コード実行(Use-After-Free) ○ 対策: free後にptr = NULLを設定 Rust: 所有権で防止 Java/Python: GCで防止 C/C++: 手動管理が必要
ダングリングポインタのイメージ
ひよこ ひよこ

ダングリングポインタって怖そうな名前だけど、どういうものなの?

ペンギン先生 ペンギン先生

たとえば、友達が引っ越したのに古い住所のまま手紙を送り続けるようなものだよ。メモリ上のデータが解放されたのに、ポインタだけがその場所を指し続けている状態のことだね。

ひよこ ひよこ

それってアクセスしたらどうなるの?

ペンギン先生 ペンギン先生

何が起きるか分からないんだ。たまたま同じ場所に別のデータが入っていたら、見知らぬ人の手紙を読んでしまうようなもの。プログラムがクラッシュしたり、データが壊れたり、最悪の場合は攻撃者に悪用されるよ。

ひよこ ひよこ

攻撃に悪用されるってどういうこと?

ペンギン先生 ペンギン先生

「Use-After-Free」と呼ばれる脆弱性だよ。解放された領域に攻撃者が悪意のあるデータを配置して、ダングリングポインタ経由でそれを実行させるんだ。ブラウザ脆弱性の多くがこのパターンで、Chrome・Firefox・Safariどれも過去に何度もやられているよ。

ひよこ ひよこ

C言語ではどうやって防ぐの?

ペンギン先生 ペンギン先生

基本的なテクニックとしては、メモリを解放した直後にポインタをNULLに設定する方法があるよ。NULLアクセスならクラッシュするから、少なくとも「気づかず壊れたデータを使い続ける」事態は防げるんだ。

ひよこ ひよこ

それって手動でやるの?忘れちゃいそう...

ペンギン先生 ペンギン先生

その通り、人間は忘れるものだからね。だからRustは所有権システムという仕組みで、コンパイル時にダングリングポインタが発生しないことを保証しているよ。参照が有効な間はデータが解放されないし、データが解放された後は参照が使えなくなる。

ひよこ ひよこ

Rustってすごいんだね!他の言語はどうしているの?

ペンギン先生 ペンギン先生

JavaPythonはそもそもプログラマが直接メモリを解放できないから、ダングリングポインタは基本的に発生しないよ。ただしC/C++で書かれたネイティブライブラリを呼び出す部分では起きうるんだ。Googleの調査ではChromeのセキュリティバグの約70%がメモリ安全性の問題で、その多くがUse-After-Freeだったんだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ダングリングポインタ」って出てきたら「解放済みメモリを指しっぱなしの危険なポインタ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Dangling Pointer」 = 宙ぶらりんのポインタ
💬 「dangling(ぶら下がっている・宙ぶらりんの)」が語源で、行き先を失ってブラブラしている状態を表しているよ
← 用語集にもどる