C で落とすための最短コード

について有意義な議論をしました。以下基本的に GCC での議論。最初は、

int* p=0;*p=0;

とかだったのですが、 "a"[0]=1; → *"0"=0; → *""=0; → ++*"" などと変遷しました。最後は短くなってませんがよりわけわからんということで。 --*"" がなんとなくかわいいです。

C では関数宣言は省略できるので、 atoi(0); なんていうのもうまく落ちてくれました。

main のある実行可能なプログラムを前提にすると、

main(int c,char** a){*a=1;}
main(int c,char** a){c/=0;}

などが出てきましたが上のは落ちず、下のは浮動小数例外であって Segmentation fault ではないなぁ…と。型を騙す方針で考えると、

main(int* c){*c=0;}
main=0;

などというあたりが出てきました。前者は引数をものすごい数与えると落ちない点、 main=194; や main=195; は x86 では正常終了してしまう(retだから)点に注意が必要です。

結局、私の結論としては

main;

でした。これもおそらく、1/128くらいの確率で落ちないわけですが。

追記:

http://d.hatena.ne.jp/isshiki/20051127/p2

上記の後、プラットフォーム非依存な方法も考えてました。そもそも落ちるという概念が存在するかどうかあやしいような環境を除いて考えると、 raise(11); や abort(); が良さそうな気がします。あと main(){} に神の目押しを用いて ^\ で SIGQUIT を送ってやれば…

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h