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

プログラムにおける「ポインタ」(pointer)とは、メインメモリ上の特定のアドレスを格納する変数である。プログラムは必要に応じてメモリ領域を確保し、不要になれば解放する。この解放後もポインタ変数が同じアドレスを保持したまま残っているのがダングリングポインタである。
発生する典型的な状況として、動的に確保したメモリをfree関数などで解放した後もそのアドレスをポインタが指し続けるケースがある。また、関数内で宣言したローカル変数のアドレスを関数の外へ返した場合も、その変数は関数終了とともに有効期間を終えるため、返されたポインタはダングリングポインタとなる。
ダングリングポインタを経由して無効な領域にアクセスすると、動作は未定義となる。解放済みの領域には以前の内容が一時的に残っていることがあり、直後には異常が現れないこともある。しかし、その領域が別の用途に再利用されると内容が書き換えられ、誤った値をもとに処理が進んだり、プログラムが突然クラッシュしたりする。実行環境や最適化の有無によって結果が変わることもあり、原因の特定が難しい不具合となる。
ダングリングポインタは不安定な動作の原因となるだけでなく、セキュリティ上の欠陥(脆弱性)となる場合もある。解放済みメモリを誤って利用する脆弱性は「Use-After-Free」(UAF)と呼ばれ、攻撃者がメモリ配置を操作できる状況では、任意のコード実行や情報漏洩の原因となることがある。ソフトウェアの安全性評価においても重要な確認項目の一つとされている。
対策として広く用いられるのは、メモリ解放直後にポインタへNULL(ヌルポインタ)を代入し、無効であることを明示する手法である。また、同じメモリ領域を複数箇所で不用意に解放しない設計も重要とされる。近年では、C++の「スマートポインタ」のようにメモリ管理を自動化する仕組みや、Rustの所有権システムのようにダングリングポインタの発生を言語仕様の段階で防ぐ仕組みを備えたプログラミング言語も普及している。JavaやC#などはガベージコレクションを採用し、こうした問題が生じないようにしている。