例えばこれ。
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 件のコメント:
コメントを投稿