31
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C 言語でセグフォらせる (おそらく) 最短コード

Last updated at Posted at 2020-07-02

セグフォブームに便乗して。多分これが一番短いんじゃないかな?というのを昔調べたことがありました。

結論からいくと、 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文字」の記事のコメント欄で同じアイデアが先に言及されてました 🙏 おもしろいと思ったらぜひそちらにいいねお願いします!

31
11
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?