2008年7月9日水曜日

世界一汚いCコード

大学で、たまたま「汚いCコードコンテスト」の話になった。

例えばこれ。
main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
1987年の入賞作品だそう。
http://www0.us.ioccc.org/1987/korn.c
実行結果は「unix」と表示される。

何故そうなるのか初見ではまったく分からない orz

このコードを読み解くためのヒントなんていうものが一緒にあった。
http://www0.us.ioccc.org/1987/korn.hint

ヒント1:unix
unixというシンボルはコード中で宣言も定義もされていない。unixは何を意味するのか。

ヒント2:"have"
"have"というのが出てくるが、""で括ってあるので文字列かと思いきや、さらに[]で括ってある。

ヒント3:[]
Cではx[1]と書くのは、*(x+1)の省略形になっている。数学的に考えれば、*(1+x)でも意味は同じだ。じゃあ、1[x]とx[1]は同じじゃないか。

本当はコードを読み解いていこうと思ったけど、今日は力尽きてしまったので終了 orz
また後で追記するかも。

---------------------------------
7月10日、追記しました。
世界一汚いCコードを読み解く:
http://mstssk.blogspot.com/2008/07/c_10.html

0 件のコメント: