yas@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> > a[10] という配列の場合, アドレスとしては a+0〜a+10 が, データとし
> > ては a[0]〜a[9] が有効であり, それ以外のアクセスについては
> > undefined behavior となっています. 従って
> > 現実的には:
> > bus error はないかもしれませんが segmentation fault はありえます.
> 
> そうですか。私は、segmentation fault も、あり得ないと思いま
> す。どういう仕組みで segmentation fault が起きるのか、説明し
> てもらえませんか。

もしかして用語の行き違いがあるんじゃないでしょうか。

小野さんがおっしゃってる「アドレスとして有効」というのは、「ポインタと
して有効な(たとえば、比較して正しい結果となる)値である」ということでしょ
う。「アドレス空間がマップされている」というOS的な意味ではなくて。
つまり、
・オブジェクトへのポインタ
・関数へのポインタ
・nullポインタ
・配列の最後の要素の「すぐ次」を指すポインタ
のいずれかです。nullポインタや配列の最後+1番めへのポインタは、「ポインタ
として有効」ですが、dereferenceしてはいけませんよね。

規格が想定しているのはたとえば、リニアでない(セグメント方式の)アドレス
空間を持つマシンです。 任意のポインタ同士では、アドレスが全順序でない
ので、比較がうまくいかなかったりします。

でも、配列の先頭から配列の最後の要素の「すぐ次」のアドレスまでは比較が
できないと困るので、その範囲は全順序を保証するように処理系を作りなさい、
ということです。で、もちろん「最後のすぐ次」を読み書きできるようにする
必要はないわけですけど。
http://www.lysator.liu.se/c/rat/c3.html#3-3-6
http://www.lysator.liu.se/c/rat/c2.html#3-2-2-3

                                前田敦司