読み方 : セグメンテーションフォールト

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

概要

Segmentation Faultとは、プログラム実行時エラーの一つで、プログラムが自身に割り当てられていないメモリ領域へアクセスしようとしてオペレーティングシステム(OS)の保護機構に強制終了させられるもの。
Segmentation Faultのイメージ画像

現代のOSは「仮想メモリ」方式を採用しており、各プログラムに対して他のプロセスやOS本体とは独立した専用のアドレス空間を割り当てている。プログラムはこの許可された範囲内でのみメモリを読み書きできる。

この範囲外や読み取り専用の領域、カーネル領域などへアクセスしようとすると、ハードウェアメモリ管理ユニットが違反を検知してOSへ通知する。OSはこれを受けてプログラムシグナルを送り、実行を停止させる。UNIX系OSでは「SIGSEGV」として扱われ、ターミナルには「Segmentation fault (core dumped)」と表示される。Windowsでは同種の事象が「アクセス違反」として報告される。

発生原因として代表的なのが、NULLポインタや未初期化ポインタの参照である。ポインタメモリ上のアドレスを格納する変数であり、有効なアドレスを代入しないまま参照しようとすると不正なアクセスが発生する。また、配列添字が範囲を超える「バッファオーバーラン」(buffer over-run)も頻出の原因である。要素数10の配列に対して11番目以降の要素を参照するコードは、プログラムの管轄外にあるメモリへ侵入することになる。

他にも、解放済みのメモリ領域を再度参照する「ダングリングポインタ」(dangling pointer)や、関数の再帰呼び出しなどでスタック領域が溢れる「スタックオーバーフロー」(stack overflow)も同様のエラーを引き起こす。これらはコンパイル時には検出されず、実行時に初めて問題が顕在化する厄介な不具合である。

このエラーはC言語やC++言語のようにプログラム開発者が直接メモリを操作できるプログラミング言語で特に起きやすい。JavaPythonなどの言語では実行時の処理系ランタイム)がメモリ管理を担うため、同種の問題はより早期に例外として検出されるが、内部実装や拡張モジュールの不具合によりSegmentation Faultが生じ、処理系ごと異常終了させられる場合もある。

この記事の著者 : (株)インセプト IT用語辞典 e-Words 編集部
1997年8月より「IT用語辞典 e-Words」を執筆・編集しています。累計公開記事数は1万ページ以上、累計サイト訪問者数は1億人以上です。学術論文や官公庁の資料などへも多数の記事が引用・参照されています。