システムコールの最高の悪用
引用元:https://www.ioccc.org/1988/dale/dale.orig.c
審査員・作者による説明:https://www.ioccc.org/1988/dale/index.html
echoと同じ。
$ gcc -traditional-cpp -o dale dale.c
$ ./dale hello world
hello world
-nオプションで改行抑制。
$ ./dale -n hello world && echo END
hello worldEND
賞名の通り、システムコール関数を乱用している。
chrootやkill(1)を呼ぶclose(0)してdup(1)してclose(1)をすることでstdoutを0番に変え、さらにpipe()を呼んで1番と2番をパイプにするfork()して、子プロセスはコマンドライン引数を2番に書き込み、親プロセスは1番を読み出し0番(stdout)に書き出す他に、#define case_3 defaultや#define while switchのようなフェイントは単純だけど好き。
次の難読化は現代では動かない。1つめは修正が必要、2つめと3つめは-traditional-cppで解決できる。
#define _ defineしている#define a(x)get/***/x/***/id())としてa(u)とすることでgetuid()を作り出している(##にすれば動く)for/*/(;;);/*/k()がfork()になることを利用している(怖い)