セグメンテーション違反

セグメンテーション違反(Segmentation Fault)とは



セグメンテーション違反とは、プログラムが実行中に、アクセスを許可されていないメモリ領域にアクセスしようとしたり、メモリの利用規則に違反した際に発生するエラーの一種です。一般的に「セグフォールト(segfault)」とも呼ばれます。

具体的には、プログラムがオペレーティングシステム(OS)の領域を上書きしようとしたり、読み取り専用と設定されたメモリ領域に書き込みを試みた場合に発生します。このエラーが発生すると、プログラムは正常に動作を継続できなくなり、多くの場合、強制終了します。

セグメンテーション違反が発生する状況



セグメンテーション違反は、以下のような状況で発生する可能性があります。

不正なメモリアドレスへのアクセス: プログラムが、割り当てられていない、またはアクセスが許可されていないメモリ領域にアクセスしようとした場合。
読み取り専用メモリへの書き込み: プログラムが、読み取り専用として設定されているメモリ領域に書き込みを試みた場合。
NULLポインタの参照外し: プログラムが、NULLポインタ(何も指していないポインタ)を通してメモリにアクセスしようとした場合。
スタックオーバーフロー: 再帰処理や非常に大きなローカル変数により、スタック領域を使い切ってしまった場合。
バッファオーバーラン: 配列などのデータ格納領域を超えてデータを書き込んでしまった場合。

オペレーティングシステムによるエラー処理



UNIX系OS: セグメンテーション違反が発生すると、プロセスは `SIGSEGV` シグナルを受け取ります。このシグナルを捕捉して、エラー処理を行うことができます。
Microsoft Windows: セグメンテーション違反が発生すると、プロセスは `STATUS_ACCESS_VIOLATION` 例外を受け取ります。この例外を捕捉して、エラー処理を行うことができます。
x86プロセッサ: 一般保護違反(general protection fault)として扱われます。
MC68000プロセッサ: アドレスエラーまたはバスエラーとして扱われることがあります。

セグメンテーション違反の例



以下は、セグメンテーション違反を発生させる可能性のあるC言語のコード例です。

c

include



int main() {
char
s = "hello world";
s = 'H'; // ここでセグメンテーション違反が発生する可能性
printf("%s
", s);
return 0;
}


このコードでは、文字列リテラル "hello world" は、通常読み取り専用のメモリ領域に配置されます。したがって、`
s = 'H';` の行で、読み取り専用のメモリ領域に書き込もうとするため、セグメンテーション違反が発生します。

セグメンテーション違反の解決



セグメンテーション違反が発生した場合は、以下の手順で原因を特定し、修正する必要があります。

1. デバッガの使用: GDBなどのデバッガを使用して、エラーが発生した箇所を特定します。
2. コードの確認: エラーが発生した箇所のコードを注意深く確認し、不正なメモリアクセスがないかを確認します。
3. メモリ管理の確認: 動的メモリ確保(`malloc`など)が正しく行われているか、メモリ解放(`free`など)が適切に行われているかを確認します。
4. ポインタの確認: ポインタが指しているアドレスが有効か、NULLポインタ参照がないかを確認します。
5. 配列の範囲外アクセス: 配列の範囲外アクセスがないかを確認します。

セグメンテーション違反の歴史的背景



セグメンテーションは、メモリ管理とOS保護の一手法として使用されてきました。近年では、ページング方式が主流となっていますが、セグメンテーションの概念は、セグメンテーション違反という形で、今でも残っています。一部のOSでは、ページング方式を使いつつも、いくつかの論理レベルでセグメンテーションの概念を保持しています。

まとめ



セグメンテーション違反は、プログラムの実行を妨げる重大なエラーです。発生原因を特定し、適切な対処を行うことで、安定したプログラムの開発につながります。メモリ管理やポインタ操作など、C言語などの低レベル言語を使用する場合は、特に注意が必要です。

関連項目



バッファオーバーラン
バスエラー
コアダンプ

外部リンク



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

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。