「セグメンテーション違反」の版間の差分

削除された内容 追加された内容
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
8行目:
== 例 ==
次の[[ANSI]] [[C言語]]のコードは[[メモリ保護機能]]を持つプラットフォーム上でセグメンテーション違反を作り出す例である。
<sourcesyntaxhighlight lang="c">
const char *s = "hello world";
*s = 'H';
</syntaxhighlight>
</source>
 
このコードを含むプログラムが[[コンパイラ|コンパイル]]された時、"hello world"の[[文字列]]リテラルはリードオンリーとしてマークされたプログラム[[実行ファイル|バイナリ]]のセクションに置かれる; ロードされたとき、オペレーティングシステムはそれをリードオンリーのメモリーセグメントで他の文字列と[[定数]]データで置き換える。
実行されたとき、''s''変数は、文字列の位置を指定するように設定され、変数を通して''H''文字をメモリに書き込むことが企てられるが、結果はセグメンテーション違反が起こる。このようなプログラムをコンパイルして実行すると、例えば次のような[[ランタイムライブラリ|ランタイム]]エラーを起こす:
<sourcesyntaxhighlight lang="text">
$ gcc segfault.c -g -o segfault
$ ./segfault
Segmentation fault
</syntaxhighlight>
</source>
 
以下は[[GNUデバッガ]]からの[[スタックトレース]]である:
<sourcesyntaxhighlight lang="text">
Program received signal SIGSEGV, Segmentation fault.
0x1c0005c2 in main () at segfault.c:6
6 *s = 'H';
</syntaxhighlight>
</source>
 
一方で、[[Linux]]上のgcc 4.1.1はデフォルトでコンパイル時エラーを発生させる:
<sourcesyntaxhighlight lang="text">
$ gcc segfault.c -g -o segfault
segfault.c: In function ‘main’:
segfault.c:4: error: assignment of read-only location
</syntaxhighlight>
</source>
 
セグメンテーション違反が起こる条件とそれらをそれら自身で宣言する方法はオペレーティングシステム特有のものである。