誰もが (少なくともコンパイル済み言語を使用するすべての人が) コンパイル エラーに直面したことがありますが、実際にコンパイラをクラッシュさせることが何回ありますか?
「内部コンパイラ エラー」がかなりの割合で発生しましたが、ほとんどは再コンパイルするだけで解消されました。コンパイラをクラッシュさせる (最小限の) コードはありますか?
誰もが (少なくともコンパイル済み言語を使用するすべての人が) コンパイル エラーに直面したことがありますが、実際にコンパイラをクラッシュさせることが何回ありますか?
「内部コンパイラ エラー」がかなりの割合で発生しましたが、ほとんどは再コンパイルするだけで解消されました。コンパイラをクラッシュさせる (最小限の) コードはありますか?
私たちが使用するコンパイラを私が書いているので、時々クラッシュします。
簡単。
// -*- C++ -*-
template <int n>
class Foo : public Foo<n+1>
{
};
int main(int, char*[])
{
Foo<0> x;
return 0;
};
ejgottl@luna:~/tmp$ g++ -ftemplate-depth-1000000 -Wall foo.cpp -o foo
g++: Internal error: Segmentation fault (program cc1plus)
Please submit a full bug report.
See `<URL:http://gcc.gnu.org/bugs.html>` for instructions.
For Debian GNU/Linux specific bug reporting instructions, see
`<URL:file:///usr/share/doc/gcc-4.2/README.Bugs>`.
まだ GHC (Haskell コンパイラ) をクラッシュさせたことはありませんが、
My brain just exploded. I can't handle pattern bindings for existentially-quantified constructors.
回避するのは非常に簡単で、トリッキーな (そして通常は間違った) 設計がない限り、これにヒットすることはありませんが、これまでで最高のコンパイラ エラー メッセージとしておそらく勝ちます。
VC は今では問題なくキャッチしていますが、90 年代半ばには、Microsoft C++ と Borland C++ コンパイラの両方がクラッシュしていました。
struct MyClass
{
MyClass operator->() { return *this; }
};
int main(int argc, char* argv[])
{
MyClass A;
A->x;
}
オーバーロードされた operator-> は本質的に再帰的です。この関数は、oper-> が再び適用されるポインターを返すことが期待されます。このフラグメントにより、コード生成は無限に再帰的に行われました。
Visual C ++ 9.0 SP1
これはちょうど私に起こった
------ Build started: Project: pdfp, Configuration: Debug Win32 ------
Compiling...
reader.cpp
xref.cpp
c:\projects\pdfp\xref.cpp(52) : fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'f:\dd\vctools\compiler\cxxfe\sl\p1\c\toil.c', line 8569)
To work around this problem, try simplifying or changing the program near the locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Generating Code...
Build log was saved at "file://c:\Projects\pdfp\Debug\BuildLog.htm"
pdfp - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
アクションスクリプト 3.0:
switch(on_some_variable)
{
}
空のスイッチ = カブーム!
まあ、これは実際にコンパイラをクラッシュさせたわけではありません.VC++が完全に良いコードを受け入れないというのは単なるバグでした. (詳細はこちら)。
これについての奇妙なことは、3 つのかなりあいまいな条件がすべて満たされた場合にのみトリガーされることでした。効果的な回避策に必要なのは、コードを 1 行移動することだけでした。必要な前提条件の 1 つは、「名前空間 std; を使用する」ことでした。これは、製品コードでは広く推奨されていません。
それにもかかわらず、Microsoft VC++ ニュースグループでは、問題の修正方法を尋ねるメッセージが定番でした。あいまいなバグに出くわした人がどれだけ多いのか、私には理解できませんでした。で、結局誰かに聞いてみたら……。
バグを引き起こすのに必要な正確なコードは、Stroustrup の「The C++ Programming Langauge」の例です。(*)
(*) 注、彼が意図的にそうしたと言っているわけではありません。確かに彼は C++ の UNIX 版でテストしたが、VC++ への影響はまったく知らなかった。
私は、C# コンパイラでいくつかのコンパイラ バグ (すべてのエッジ ケース、すべて適切に報告されています) を確認し、他の人によって引き起こされたいくつかのクラッシュを確認しました。
私が遭遇した中で最も恐ろしい (一種の) コンパイラーのバグは、Java のあるバージョンの JIT バグでした。かなり再現性がありましたが、VM がダウンしました。かなりノーオペレーションのステートメントを追加することで (私は正確に何を思い出すことができません - おそらく初期値を持つ追加のローカル変数を宣言するだけです)、それがたまたま発生したコーナーケースから遠ざけました - そしてそれは後のバージョンで修正されました.
これにより、C64 BASIC がクラッシュしました。
PRINT 0 + "" +- 0
はい、特にそれが古い、または保守が行き届いていないコンパイラ (GCC 2.95、C++ モードの Tendra) の場合はそうです。ただし、コードの断片は保持しません。
Visual C++ 5。
おっと、typedef の 'e' を忘れて、コンパイラがクラッシュしました。
typdef struct kGUIColor GameColor;
c:\source\kgui\samples\space\space.cpp(35) : fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'msc1.cpp', line 2708)
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
VS2003 C++ コンパイラをクラッシュさせる方法を次に示します。
typedef map<int,int> Tmap;
private: Tmap; * m_map;
これにより、クラッシュが発生し、次のエラー メッセージが表示されます。
致命的なエラー C1001: 内部コンパイラ エラー (コンパイラ ファイル 'msc1.cpp'、行 2708) 詳細については、Visual C++ ヘルプ メニューのテクニカル サポート コマンドを選択するか、テクニカル サポート ヘルプ ファイルを開いてください。
Tmap
( を定義する 2 行目)の直後のセミコロンを削除してm_map
、エラーを解消します。
バージョン1.2.xでは、Mono C#コンパイラは複雑なコードでかなりクラッシュしていました(私が正しく覚えていれば、ネストされた匿名のデリゲート)。幸い、2.xリリースでは、クラッシュは発生していません。
@Nickのおかげで、これはVS2005をクラッシュさせます。
template<typename Res, typename T>
Res operator_cast(const T& t)
{
return t.operator Res();
}
int main()
{
return operator_cast<int>(0);
}
私が取り組んでいたプロジェクトでは、Boost Lambda式の特定の使用法により、VisualC++コンパイラがクラッシュする可能性がありました。(Visual Studio 2003を使用していました)
コンパイラはリリースビルド中にのみクラッシュし、デバッグビルドは正常に機能しました。
ラムダライブラリの適切な使用法についてチーム全体で激しい戦争がありましたが、コンパイラがそれを解決してくれたことにほぼ感謝しています。:-)
"Catastrophic Failure" というメッセージが表示されたら、あなたが試みていることがわかります....
マイケル
私の以前の仕事では、(ICE) コンパイラをクラッシュさせたり、正しくないコードを生成させたりすることで有名なシミュレータがありました。そして、コードが実際に正しく生成されたとき、コンパイラは 1 つのソース ファイルに対して 15 分かかることがよくありました。Visual Studio は (私がそこで働いている限り) シミュレーター コアをコンパイルできませんでした。
コアは DSL から自動的に生成され、生成されたコードはしばしばコンパイラを限界まで押し上げました。
GCC の新しいバージョンへのアップグレードは、多くの場合、広い範囲で不安を引き起こしました: 新しいバージョンは動作しますか?
古い OS プロジェクトをコンパイルするために、pcc と gcc の両方を使用しています。
pcc と gcc の両方が重要なコードを処理する方法にバグが見つかり、pcc がクラッシュしました。(文字は私のプラットフォームで署名されています)
struct{
char myvalue:1;
}mystruct;
ただし、すべてのビットフィールド値が int でなければならないため、pcc がクラッシュしました。そのため、実際にはもっとバグがありますが、gcc はそれを間違って処理します。ほら、考えてみれば、署名されていますが、1 ビット分のスペースしかありません。したがって、0 と -1 しか格納できません。まあ、gcc は 0 または 1 を格納することで間違って処理します。
以前、コンパイラをメモリ不足で実行してクラッシュさせたことがあります。
DOS コンパイラに約 0.5MB のソース コードを提供します。噛み砕く。
MicrosoftXbox360コンパイラは簡単にクラッシュする可能性があります。日本語のコメント付きのソースコードが与えられ、通常のテキストに変換すると、その行の最後の文字の1つが「\」だったので、次の行にコメントを続けました。次の行がswitchコマンドの場合、コンパイラはクラッシュします。
//wierd japanese characters here %^$$\
switch(n)
{
case 0:
.....
break;
case 1:
.....
break;
}
ソースエンジンのマップをコンパイルするときにVVISがクラッシュしました。
それは重要ですか?
GCC 2.95でのテンプレートのサポート(バージョンを覚えていないかもしれませんが)にはバグがありました。さまざまな構成により、クラッシュが発生します。テストケースが見つかりませんが、テンプレートの内部クラス(またはテンプレートである内部クラス)がコンパイラエラーを取得する1つの方法だったと思います。
コンパイラをクラッシュさせようとしたことはありませんが、VBコンパイラ/デバッガが1日に数回出ていました。VBですが、それは重要ですか?
私はなんとかPythonインタープリターをセグメンテーションフォールトしました。もちろん、私は当時C拡張機能に取り組んでいて、それを完全に正しくしていませんでした。
Pythonドキュメントのジェネレーターの例を使用したとき、使用していたPythonのバージョンが壊れていました。同じ週、私の同僚の1人がFFIを悪用して、数値3を含む計算でPythonがクラッシュするようになりました。
私はかつて、コンピュータを自発的に再起動させる C プログラムを書きました。1 つの欠点は、当時実装しようとしていたマージソートとはまったく関係がないことです。
幸いなことに、ポインターエラーが判明すると、それはなくなりました。
コンパイラではなく、Visual Studio 2008 のリンカが Windows 7 64 ビットで 1 日に数回クラッシュします。すぐに再構築すると、常にクラッシュすることなく機能します。マイクロソフトは気にしていないようです...
コード自体が原因ではないため、質問に対する答えではありませんが、この特定の問題についていつでも喜んで怒鳴ります:-)
C++ をコンパイルするときに、テンプレートの使用方法が間違っていると (たとえば、終了の ">" を見逃すなどして)、VC++ がクラッシュしました。
やった。いくつかの Delphi バージョン (#4 としましょう) は、不可解なエラー メッセージで非常に頻繁にクラッシュしました。
新しいバージョン (2006 以降) は安定していますが、堅実ではありません。(その場合、7は素晴らしかったです)。
コンパイラのクラッシュは、大規模な編集や、複雑なプロジェクト (多数の dll) のデバッグ セッションで発生することがよくあります。ほとんどの場合、IDE を再起動するだけで十分です。ただし、場合によっては PC を再起動する必要があります。
O と私はかつて、スワップファイルが大きくなりすぎたために OS2 とコンパイラをクラッシュさせました。
これをクラッシュと呼ぶかどうかはわかりませんが、sdcc ( Small Device C Compiler ) は、特定の方法で作成されたコードのコンパイルに失敗します。
プリプロセッサ マクロがアンロールされると、フラットではありますが、コードが大きくなります。実行はスタートアップ コード (スタックのセットアップなど) をスキップし、main() の先頭から開始します。
この回答の関連部分:
時折、sdcc が構文的に正しいコードのコンパイルを拒否し、メモリ不足に関するメッセージが表示されることがありました。これは、8 GB の RAM を搭載した 64 ビット ボックスでコンパイルした場合にも発生しました。
これらの場合の解決策は、ファームウェアを別々の部分に分割し、それらを別々にコンパイルして、別々に実行することでした。ピースは元に戻すことができたかもしれませんが、その時点では問題ありませんでした。
私は試しませんでしたが、Keil 8051 コンパイラはおそらく問題のあるコードを処理できたはずです。
私は何度も F# コンパイラをクラッシュさせました。しかし、それはベータ版、アルファ版、研究版などのコンパイラであったため、公平ではありません。
Delphi 7 を何度もクラッシュさせて、従来の DOS コードをコンパイルするように依頼しました。
主な原因は、システム ユニット内にあるという何らかの資格にあるようです。これは常に爆発するとは限りませんが、そのようなもので爆発するときは、そのようなオーバーライドを必要とするものを調べて書き直せば、問題は解決します。
爆破は 100% 再現可能ですが、単純なテスト ケースを作成することはできませんでした。ほとんどの場合、実際にコンパイラがクラッシュすることはありません。通常、問題とは関係のないエラーが発生し、そこから数百行になる場合があります。環境が不安定になり、保存して終了しても問題ありませんが、他に何もすることは考えていません。
Borland Pascal 7 (最後の dos バージョン) で石器時代に戻って、私は何度もそれを壊しました。クラッシュは発生せず、正しくない一貫性のないコードが出力されるだけです。最終的に、.EXE (デバッグ情報はカウントしない) を 3 MB 未満に抑えることを学びました。それを超えると、さらに不安定になりました。
私は何度も VC++ をクラッシュさせましたが、通常はテンプレート コードを使用しています。しかし、それは最も興味深いクラッシュではありません...
/analyze オプションを使用して VS2005 Team System コンパイラをクラッシュさせ、スイッチを使用せずにエラーなしでコンパイルされた共有コード ライブラリをコンパイルし、VS2008 でスイッチを使用しても使用しなくてもクラッシュしました。もちろん古いバージョンのコンパイラのバグだったのでMSはあまり興味を示しませんでしたが、かなり面白いと思いました。
もっと興味深いことがありました: リンカの内部エラー...
それを引き起こす方法を知っていますか?
以前ほどは発生しませんが、ASP.net プリコンパイラに問題が発生することがあります。個人的には見たことがありませんが、別のプロジェクトで名前の衝突があった問題を修正しました。プリコンパイル中に名前空間を適切に使用する (コンパイラ クラッシュの原因となる)。
古き良き時代 (管理されていない MSVC++) では、通常、外部の静的 win32 クラス (.lib) でのリンクが原因で奇妙なコンパイラ クラッシュが発生し、いくつかの奇妙なコードが時折問題を引き起こしましたが、これらはすべて非常に迅速に検出されました。
昔、私は Control Data コンピューターで COBOL の作業をしていました。(おかしなことに聞こえるかもしれませんが、Control Data は高性能の科学計算システムで知られており、COBOL コンパイラは少し後付けでした。) 詳細は覚えていませんが、試していたプログラムがありました。新しいバージョンに移植します。いくつかの方法を試してみたところ、コンパイラをクラッシュさせるか、無限ループに陥らせるかのどちらかを選択できることがわかりました。
私のチームでは、ビルド マシンの csharp コンパイラでランダムな内部コンパイラ エラーが頻繁に発生しました。各ターゲットのビルドの間にすべての bin/obj フォルダーを消去することで問題を解決しました。