セグメンテーション違反
[Wikipedia|▼Menu]
Kritaのセグメンテーション違反の例

セグメンテーション違反(英語: segmentation fault)とは、ソフトウェア実行時のフォールト状態(あるいはフォールト条件)の一種であり、ソフトウェアがアクセス禁止とされているメモリ上のエリアにアクセスしようとしたり、メモリ上の位置ごとに設定されているルールに違反してメモリにアクセスしようとするときに起こるものである。略してセグフォールト(: segfault)とも。

たとえば、あるソフトウェアがオペレーティングシステム(OS)を上書きしようとしたり、そのソフトウェアに関してはリードオンリーと設定されている位置へ当該ソフトが書き込みをしようとする時に起こる。

UNIX系のオペレーティングシステム上では、不正なメモリにアクセスをするプロセスはSIGSEGVシグナルを受け取る。Microsoft Windows上では、不正なメモリにアクセスするプロセスはSTATUS_ACCESS_VIOLATION例外を受け取る。

なおx86プロセッサによるシステムでは、この種のイベントはen:general protection fault扱いになり、MC68000のようなプロセッサによるシステムはこれらのイベントを「アドレスエラー」もしくは「バスエラー」として参照しようとする傾向にある。

セグメント方式は、メモリ管理およびOS保護の手法の一種である。大部分の用途のためにページング方式に置き換えられつつあるが、セグメンテーションの専門用語はまだ多く使用されている。セグメンテーション違反はその一例である。オペレーティングシステムの中にはメインメモリ管理の方針としてページング方法が使用されているが、いくつかの論理レベルでまだセグメンテーションを持つものがある。

次のANSI C言語のコードはメモリ保護機能を持つプラットフォーム上でセグメンテーション違反を作り出す例である。const char *s = "hello world";*s = 'H';

このコードを含むプログラムがコンパイルされた時、"hello world"の文字列リテラルはリードオンリーとしてマークされたプログラムバイナリのセクションに置かれる; ロードされたとき、オペレーティングシステムはそれをリードオンリーのメモリーセグメントで他の文字列と定数データで置き換える。実行されたとき、s変数は、文字列の位置を指定するように設定され、変数を通してH文字をメモリに書き込むことが企てられるが、結果はセグメンテーション違反が起こる。このようなプログラムをコンパイルして実行すると、例えば次のようなランタイムエラーを起こす:$ gcc segfault.c -g -o segfault$ ./segfaultSegmentation fault

以下はGNUデバッガからのスタックトレースである:Program received signal SIGSEGV, Segmentation fault.0x1c0005c2 in main () at segfault.c:66 *s = 'H';

一方で、Linux上のgcc 4.1.1はデフォルトでコンパイル時エラーを発生させる:$ gcc segfault.c -g -o segfaultsegfault.c: In function ‘main’:segfault.c:4: error: assignment of read-only location

セグメンテーション違反が起こる条件とそれらをそれら自身で宣言する方法はオペレーティングシステム特有のものである。

非常に一般的なプログラムエラーはNullポインタ参照外し(Nullポインタを通した読み込みもしくは書き込み、C言語では"存在しないオブジェクトへのポインタ"を意味し、エラーインディケータとして使用される)であるので、大抵のオペレーティングシステムはアクセスがセグメンテーション違反を引き起こすようなアドレスをNullポインタにマッピングする。
関連項目

バッファオーバーラン

バスエラー

コアダンプ

Segfault(英語版) - このエラーの名前を取ったユーモアウェブサイト。

外部リンク

A FAQ: User contributed answers regarding the definition of a segmentation fault

A "null pointer" explained

Answer to: NULL is guaranteed to be 0, but the null pointer is not?

Resolving crashes and segmentation faults, an article from the Real-Time embedded blog.

The Open Group Base Specifications Issue 6 signal.h










オペレーティングシステム
概要

歴史

一覧

カーネル

アーキテクチャ

モノリシックカーネル

マイクロカーネル

エクソカーネル(英語版)

ハイブリッドカーネル(英語版)

コンポーネント

アドレス空間

デバイスドライバ

ローダブル・カーネル・モジュール

マイクロカーネル


プロセス管理

概念

コンテキストスイッチ

割り込み

プロセス間通信

プロセス

プロセス制御ブロック

リアルタイム

スレッド

タイムシェアリング

スケジューリング
アルゴリズム


マルチタスク

多段フィードバックキュー

プリエンプション

ラウンドロビン


メモリ管理
リソース保護

バスエラー

メモリ保護

ページング方式

リングプロテクション

セグメンテーション違反

仮想記憶

一般保護違反(英語版)

ストレージアクセスと
ファイルシステム

ブートローダ

デフラグメンテーション

デバイスファイル

Inode

ジャーナル

パーティション

仮想ファイルシステム

一覧

Unix系

AIX

Android

BSD

FreeBSD

OpenBSD

NetBSD

DragonFlyBSD


ChromeOS

Darwin

GNU

HP-UX

illumos

iOSiPadOS

watchOS


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:17 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef