セグフォブームに便乗して。多分これが一番短いんじゃないかな?というのを昔調べたことがありました。
結論からいくと、 GCC は main
シンボルが宣言されていればとりあえず実行ファイルを生成できます。
宣言時の型は省略できる (暗黙に int
になる) ので、 main;
とだけ書いておけばとりあえず main
シンボルを宣言できます。したがって以下の5文字でとりあえず実行ファイルを作ることができます。
segfault.c
main;
$ gcc segfault.c
segfault.c:1:1: warning: data definition has no type or storage class
main;
^~~~
segfault.c:1:1: warning: type defaults to 'int' in declaration of 'main' [-Wimplicit-int]
実行すると main
関数を呼び出そうとしますが、もちろんまともな実体がないので死にます (「main
らしきもの」を call
した次のステップで、変な命令を踏んで死)。
$ ./a.out
Segmentation fault
ちなみに main
シンボルすら定義しない空のプログラムも、 C のプログラムとしては valid なのでコンパイルまではできるみたいです。ただし実行ファイルを作ろうとするとリンカが死ぬので、実行はできません。
kyomu.c
$ gcc -c kyomu.c # コンパイルはできる
$ gcc kyomu.c # リンクはできない
/usr/lib/gcc/x86_64-redhat-linux/7/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
追記: 「16文字」の記事のコメント欄で同じアイデアが先に言及されてました 🙏 おもしろいと思ったらぜひそちらにいいねお願いします!