■ core dumpするコードの短さを競う「Core Golf」
さて、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 | 2007年09月13日 16:22
> yupo5656さん
2byteキター!
この最短記録を抜くのは難しそうですね。早速ありがとうございます。
投稿者: takesako | 2007年09月13日 16:32
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
投稿者: Yappo | 2007年09月13日 18:14
適当なシンボルがあればいいので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
投稿者: eban | 2007年09月13日 19:16
コアダンプ指向言語があってもいいはず
投稿者: ujihisa | 2007年09月13日 23:43
あぁっ、他の方に先を越されてしまいましたが、
Rubyではコマンドラインオプションの指定でSEGVしていた(る?)例がたくさんあります。他の処理系もあるかもしれません。
なので0バイト。
投稿者: 斎藤ただし | 2007年09月14日 09:38