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のコード補完に対するニーズを垣間見ることができる・・・そうです。
まだもうちょっとありますが
紹介はこのあたりにしておきます。また来年もやるかもよ、とのことですので、興味がある方は上記ページをウォッチしておくといいと思います。