Segmentation faultとは

我がブログの検索キーワードで「Segmentation fault」が急上昇中である。
これが「DXRuby Segmentation fault」だったら困ってしまうところだが、ただの「Segmentation fault」なのでそもそもそれがRubyの話なのかどうかもわからない。
メモリ管理機能のあるCPUでソフトを動かしている限り、普通に発生しうるものだからだ。


ちょっと高級なCPUにはMMU(Memory Management Unit)というものがついていて、CPUのアーキテクチャごとに違いはあるだろうが、だいたいメモリのページングだとか、アクセス保護だとか、そういうことをしている。
んで、アクセス保護を設定してある場合に、アクセスしてはいけないアドレスにアクセスしたとか、書き込み禁止アドレスに書き込んだとか、そういう場合にSegmentation faultが起こる。
RubyとかPHPとかのメジャーなスクリプト言語を使っている場合、インタプリタや標準ライブラリにはそのようなバグはほとんどないはずだから、普通は起こらない。
Cでプログラムを書けば、ちょっとコードを打ち間違えただけで出る。
ポインタを初期化し忘れたとか、配列の要素に使う変数を間違えたとか。
同様に、Cで書かれたRuby拡張ライブラリも、たとえばDXRubyみたいないい加減に作られた拡張ライブラリだとたまに出る。
1.0.6になってようやく修正されたぐらいだ。
まだあるかもしれないから、見つけたら報告よろしくお願いします。


ともかく、基本的には出てはいけないエラーである。
アプリケーションならユーザーのどんな操作でも出てはいけないし、言語処理系ならユーザーがどんなプログラムを書いても出てはいけない。
Segmentation faultで検索するよーな人は、たぶんそれが出ちゃった人だろう。
人が作ったプログラムを使っていて出たなら、再現性を調べて報告だ。
鬼の首を取ったかのように得意げに報告するといいだろう。いや、それはさすがに冗談だが。
自分で作ったプログラムで出るなら、明らかにバグがある。
きちんと調べて直そう。
よほどマイナーなコンパイラを使ってない限りは、Cのプログラムなら自分で書いたコードにバグがある。
Rubyなどの場合で出ちゃったら処理系や拡張ライブラリを疑っていいが、Cの場合はコンパイラや標準ライブラリを疑ってもロクなことは無い。
「printfは正しい」のだ。


ということで、RubyやDXRubyとは全然関係無い人が来ることもあるかと思って、汎用的に書いておいた。
役に立てばいいのだが。