CPP Abuse

CPP悪用

受賞者:Jens Schweikhardt

引用元:https://www.ioccc.org/1998/schweikh1.c

審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/1998/schweikh1.hint

動作

Cコンパイラのconformance testとして書かれたプログラム。 よくわからない出力が出てくるだけ。 終了コードが0なら成功なのだと思う。

$ cp data info

$ gcc -o schweikh1 schweikh1.c

$ ./schweikh1
<errno.h>:
#define e
<stddef.h>:
<assert.h>:
#define asse
<locale.h>:
#define NULL ((void
<math.h>:
#define M_SQRT1_2 0.70710678118654752440
...

解説

#includeの引数をマクロの結合で生成したり、#lineのファイル名にNUL文字を挿入したり、digraphを利用したりして、当時のCコンパイラのバグ挙動をつきまくったプログラムとのこと。

ただ、当時から審査員コメントに「元のコードはgccでは動くがISO C89違反」のような記述があり、どこまで信用していいのかわからない。 とりあえずstdio.hをマクロの結合で生成するのは現代のgccでも禁止されていた。 また#lineinfo\0rを置くのは可能だが、\0より先は__FILE__では参照できなかった。 これらを修正して終了コードが0になるようになったが、これで想定通りに動いているのかどうかはわからない。

パッチ

パッチをダウンロード