Segmentation Fault【セグメンテーションフォールト】segfault/セグフォ
概要

現代のOSは「仮想メモリ」方式を採用しており、各プログラムに対して他のプロセスやOS本体とは独立した専用のアドレス空間を割り当てている。プログラムはこの許可された範囲内でのみメモリを読み書きできる。
この範囲外や読み取り専用の領域、カーネル領域などへアクセスしようとすると、ハードウェアのメモリ管理ユニットが違反を検知してOSへ通知する。OSはこれを受けてプログラムへシグナルを送り、実行を停止させる。UNIX系OSでは「SIGSEGV」として扱われ、ターミナルには「Segmentation fault (core dumped)」と表示される。Windowsでは同種の事象が「アクセス違反」として報告される。
発生原因として代表的なのが、NULLポインタや未初期化ポインタの参照である。ポインタはメモリ上のアドレスを格納する変数であり、有効なアドレスを代入しないまま参照しようとすると不正なアクセスが発生する。また、配列の添字が範囲を超える「バッファオーバーラン」(buffer over-run)も頻出の原因である。要素数10の配列に対して11番目以降の要素を参照するコードは、プログラムの管轄外にあるメモリへ侵入することになる。
他にも、解放済みのメモリ領域を再度参照する「ダングリングポインタ」(dangling pointer)や、関数の再帰呼び出しなどでスタック領域が溢れる「スタックオーバーフロー」(stack overflow)も同様のエラーを引き起こす。これらはコンパイル時には検出されず、実行時に初めて問題が顕在化する厄介な不具合である。
このエラーはC言語やC++言語のようにプログラム開発者が直接メモリを操作できるプログラミング言語で特に起きやすい。JavaやPythonなどの言語では実行時の処理系(ランタイム)がメモリ管理を担うため、同種の問題はより早期に例外として検出されるが、内部実装や拡張モジュールの不具合によりSegmentation Faultが生じ、処理系ごと異常終了させられる場合もある。