[language-agnostic] 你有沒有墜毀的編譯器?


Answers

簡單。

// -*- 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>`.
Question

每個人(至少每個使用編譯語言的人)都面臨編譯錯誤,但是實際上碰到編譯器有多少次?

我有我的公平份額的“內部編譯器錯誤”,但大多數只是通過重新編譯而消失。 你有一個(最小)的代碼崩潰的編譯器?




糟糕,在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



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 ==========



我已經崩潰了Delphi 7多次要求它編譯遺留的DOS代碼。

主要的罪魁禍首似乎是任何在系統單位的東西的資格。 這不會總是把它炸掉,但是當這些東西爆炸時,我會翻閱並重寫任何需要重寫的東西,問題就會消失。

爆炸是100%可再生的,但我從來沒有設法做一個簡單的測試案例。 在大多數情況下,它實際上並沒有使編譯器崩潰,通常你會得到一個與這個問題無關的錯誤,而且可能是數百行錯誤。 環境是不穩定的,保存和退出是好的,但別想別的。

回到Borland Pascal 7(最後的dos版本)的石器時代,我多次拋棄它。 沒有崩潰,只是不正確和不一致的代碼發射。 我終於學會了將.EXE(不包括調試信息)保持在3mb以下。 我走得越遠越不穩定。




這是一個崩潰VS2003 C ++編譯器的方法。

typedef map<int,int> Tmap;
private: Tmap; * m_map;

這將導致崩潰並出現以下錯誤消息

致命錯誤C1001:內部編譯器錯誤(編譯器文件'msc1.cpp',行2708)請選擇Visual C ++幫助菜單上的技術支持命令或打開技術支持幫助文件以獲取更多信息

Tmap (定義m_map第二行)之後立即刪除分號以消除錯誤。




當編譯C ++時,VC ++崩潰了,如果模板使用被搞砸(例如,在關閉“>”時丟失)。




是的,特別是當它是一個舊的或不足的編譯器(GCC 2.95,在C ++模式下的Tendra)。 不過,我不保留這些代碼。




我已經在C#編譯器中看到了一些編譯器錯誤(所有的邊緣情況,都適當地報告),並確認了其他人引起的一些崩潰。

我遇到的最恐怖的編譯器(一類)錯誤是一個Java版本中的JIT錯誤。 這是相當可重複的,但造成虛擬機下降。 添加一個相當不可操作的語句(我不記得正確的是什麼 - 可能只是聲明一個額外的本地變量的初始值)移動它的情況下發生的事情 - 它已被修復後來的版本。




VC現在已經很優雅,但在90年代中期,這會使Microsoft C ++和Borland C ++編譯器崩潰:

struct MyClass
{
    MyClass operator->() { return *this; }
};


int main(int argc, char* argv[])
{
    MyClass A;
    A->x;
}

重載的operator->本質上是遞歸的。 該函數應該返回一個指針,該指針又被應用於。 這個片段使代碼生成無限遞歸。




我不知道我是否會調用它崩潰,但sdcc( 小型設備C編譯器 )在編譯以特定方式形成的代碼時失敗:

  • 目標: 8051
  • 代碼必須在從外部測試器加載的512字節高速緩存中執行
  • 測試人員在控制和存儲的代碼緩存不能獲取下一頁
  • 不允許任何函數調用 - PC(程序計數器)將跳轉到不駐留在緩存中的地方; 預處理宏被用來完成模塊化的編碼實踐
  • 如果不跳出緩存,則允許跳轉(分支)
  • 沒有const值 - 在程序代碼的數據部分,導致緩存中的代碼獲取不在緩存中的代碼 - 預處理器常量(#define)OK

預處理器宏被展開,結果是平坦的,但是大的代碼 - main()中的所有東西。 執行跳過啟動代碼(設置堆棧等),並在main()開始處啟動

這個答案的相關部分:

偶爾,sdcc會拒絕編譯語法正確的代碼,並提示有關內存不足的消息。 這甚至發生在具有8GB RAM的64位盒子上的編譯。

在這些情況下,解決方案是將固件拆分成單獨的部分並分別編譯並單獨執行。 這些碎片可能已經能夠被連接在一起,但是在那一點上並不重要。

我沒有嘗試,但Keil 8051編譯器可能可以處理有問題的代碼。




當你收到“災難性失敗”的消息時,你知道你正在嘗試....

邁克爾




感謝@Nick ,這使VS2005崩潰。

 template<typename Res, typename T>
 Res operator_cast(const T& t)
 {
     return t.operator Res();
 }

 int main()
 {
    return operator_cast<int>(0);
 }



有一次我使用Python文檔中的生成器示例,它打破了我們使用的Python版本。 同一周,我的一個同事設法濫用了FFI,因此任何涉及數字3的計算都會使python崩潰。




在Mono C#編譯器的1.2.x版本中,如果我沒有記錯,嵌套的匿名代理將會使代碼崩潰。 幸運的是,在2.x版本中,我還沒有看到任何崩潰。




我設法segfault Python解釋器。 當然,我當時正在做一個C擴展,並且不是很正確。






Related