C++のコンパイルエラー爆発を競うコンテスト

Results of the Grand C++ Error Explosion Competition

少し前に、C++コンパイルエラーの長さを競うコンテストが開催されていました。

受賞のカテゴリは2つあり、ひとつめは最小コードで最大のコンパイルエラーを出した人、もうひとつは芸術的な評価による受賞です。

最小コードで最大のコンパイルエラー

この部門で優勝したのはEd Hanwayさんという方で、ソースコード量に対して59億倍のコンパイルエラーメッセージを出力したそうです。

それには、自身を2回インクルードするという手法が使われていたそうです。

#include ".//.//.//.//jeh.cpp"
#include "jeh.cpp"

次点として、インクルードに後方参照を使用した、7億9千万倍のコンパイルエラーを出力するコード:

#include "set>.cpp"
#include "set>.cpp"

可変引数テンプレートの再帰を利用した、6億5700万倍のコンパイルエラーを出力するコード:

template<class T,class...>class C{C<T*const,T,C>a;C<T,C>b;};C<int>c;

などがありました。

最高のチート

このコンテストの中では、多くのおもしろい試みが行われて、たとえばC++のダイグラフ拡張を使ったものがありました。検証スクリプトのゼロ除算バグを悪用しようとしたもの、評価スクリプトにパッチを当てて無限のエラーを出力させようとしたものなどもありました。

しかし最高のチートを行った人はこれとは別の方向に行きました。そのコード自体は一つのスペースが入ってるだけのものでしたが、ヘッダ探索のパスが以下のように書かれていたそうです。

/usr/include; perl -e "@c=\"x\"x(2**16); while(1) {print @c}" 1>&2

C++コンパイラがこれを実行すると、シェルコードがサンドボックスを脱出するのだそうです。

最高の驚き

以下のコードは、素朴ではありますが、予期せずコンパイルエラーが爆発します。

template<class T>class L{L<T*>operator->()};L<int>i=i->

Clangは「セミコロンが不足している」と正しく認識してくれますが、その後に無限のテンプレート再帰によってコンパイラがセグメンテーションフォルトになります。 この種の問題を防ぐために、IDEのコード補完に対するニーズを垣間見ることができる・・・そうです。

まだもうちょっとありますが

紹介はこのあたりにしておきます。また来年もやるかもよ、とのことですので、興味がある方は上記ページをウォッチしておくといいと思います。