« ITpro Challenge!でニコLT発表してきました | メイン | Linux Conference 2007ストリーミング中継 »

core dumpするコードの短さを競う「Core Golf」

まめめもさんの core golf のエントリー(6/27)より
さて、core dump するコードの短さで競う core golf はゲームとして成立するでしょうか。明らかに環境や処理系に依存するのでルールの決め方が難しいです。とりあえずうちでは core dump した C のコード (15B) 。もっと短くなる?

core dumpの定義はいろいろあると思いますが、とりあえず手元の環境 CentOS Linux x64_64 で segmentation fault が起きるコードで。

(1) C言語で core dump

早速、core dumpした5byteのCのコード。 (via. λx.x K S K @ はてな - core golf

main;
実行結果
$ echo -n "main;" > a.c && cc a.c && ./a.out 
a.c:1: 警告: データ定義が型や記憶クラスを持っていません 
a.c:1:6: 警告: no newline at end of file 
zsh: segmentation fault  ./a.out

コンパイラの警告は出るけどちゃんと実行バイナリができて、それを実行するとsegmentation faultしてくれます。

(2) Perlでcore dump

正規表現でsegmentation faultを起こすのが簡単かな、と思ってトライ。Perlで22byte。
(via. [perl #33945] Segmentation fault with deep recursion in regex engine

$x=qr/(??{$x})/;""=~$x
実行結果
$ perl -e'$x=qr/(??{$x})/;""=~$x' 
zsh: segmentation fault  perl -e'$x=qr/(??{$x})/;""=~$x'

barewordを使ってもよければもう1byte節約することができますが、とりあえずここまで。

(3) Rubyでcore dump

ruby-devのMLには、最新のrubyをcore dumpさせるコードがたくさん投稿されているようです。以下、手元の環境で再現した5byteのコードです。
(via. [ruby-dev:31085] 0..:" dumps core

0..:"
実行結果
$ ruby -e '0..:"'
-e:1: unterminated string meets end of file
-e:1: empty symbol literal
-e:1: [BUG] Segmentation fault
ruby 1.8.5 (2006-08-25) [x86_64-linux]

アボートしました

最強言語 Ruby ?

あと、Ruby 1.8系では正常に(?)core dumpできませんが、Ruby 1.9 では 4byte で core dump 可能なコードもいくつか報告されているみたいでした。 もしかしたら最新のリリースビルドでは再現できないかもしれません。

$ ruby -e '$&;[]'
$ ruby -e '$`;0'
$ ruby -e '$1;0'
$ ruby -e '{*0}'

ということで、現在 Ruby 1.9 が 4 byte で Core Golf 最強になっていますが、3 byte 以下で core dumpできる処理系をご存知の方がいらっしゃいましたら教えてください。

コメント

↓とかどうでしょー? (2bytes in C)

% cat a.c
a;^D
% gcc -c a.c && ld --entry=a a.o
% ./a.out
Segmentation fault

> yupo5656さん
2byteキター!
この最短記録を抜くのは難しそうですね。早速ありがとうございます。

0バイトいけました!
perl -MAcme::CoreDump -e ''

別途下記のCPANモジュール(予定)も入れといてください。
package Acme::CoreDump;$x=qr/(??{$x})/;""=~$x;1;
__END__

=head1 NAME

Acme::CoreDump - omg!

=head1 SYNOPSIS

$ perl -MAcme::CoreDump -e ''

=head1 DESCRIPTION

lol

=head1 AUTHOR

Kazuhiro Osawa Eko@yappo.ne.jpE

=head1 SEE ALSO

L

=head1 LICENSE

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut

適当なシンボルがあればいいのでCでも0バイトは可能です。

% touch foo.c; ls -s foo.c; gcc -c foo.c; ld -e _end foo.o; ./a.out
0 foo.c
zsh: segmentation fault ./a.out

コアダンプ指向言語があってもいいはず

あぁっ、他の方に先を越されてしまいましたが、
Rubyではコマンドラインオプションの指定でSEGVしていた(る?)例がたくさんあります。他の処理系もあるかもしれません。
なので0バイト。

コメントを投稿