Вы когда-нибудь разбивали компилятор? - PullRequest
19 голосов
/ 11 октября 2008

Каждый (по крайней мере, каждый, кто использует скомпилированный язык) сталкивался с ошибками компиляции, но сколько раз вы действительно врезались в компилятор?

Моя справедливая доля "внутренних ошибок компилятора" , но большинство ушло просто путем повторной компиляции. У вас есть (минимальный) кусок кода, который приводит к сбою компилятора?

Ответы [ 39 ]

2 голосов
/ 11 октября 2008

Да, особенно если это старый или недостаточно поддерживаемый компилятор (GCC 2.95, Tendra в режиме C ++). Однако я не храню фрагменты кода.

2 голосов
/ 23 сентября 2010

Вот способ сбить компилятор VS2003 C ++.

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

Это приведет к сбою и появлению следующего сообщения об ошибке

фатальная ошибка C1001: ВНУТРЕННИЙ КОМПИЛЕР ОШИБКА (файл компилятора 'msc1.cpp', строка 2708) Пожалуйста, выберите Технический Команда поддержки в справке Visual C ++ меню или откройте службу технической поддержки файл справки для получения дополнительной информации

Удалите точку с запятой сразу после Tmap (вторая строка, которая определяет m_map), чтобы устранить ошибку.

2 голосов
/ 10 апреля 2010

Сегодня VS2003SP1 дал мне C1001 (Внутренняя ошибка компилятора) с жалобой на файл компилятора 'msc1.cpp', строка 2708) из-за этого:

struct PATTERN {
  …
};

Оказывается, проблема заключалась в том, что имя структуры, которое я пытался определить (PATTERN), уже было typedef в GDI для типа кисти. Однако вместо того, чтобы сказать мне, что символ уже определен (как он это делает для большинства других вещей), он не только не указал на структуру как на проблему - я сузил проблему до нее, выборочно комментируя блоки, пока ошибка не исчезла - но это также дало мне вышеупомянутую загадочную ошибку, которая не имеет ничего общего с указанным файлом - которую я даже не могу найти, чтобы исследовать данную строку. : |


Я смог воспроизвести его с помощью следующего кода:

    typedef int SOMETHINGOROTHER;
    struct SOMETHINGOROTHER {};

> fatal error C1001: INTERNAL COMPILER ERROR
> (compiler file 'msc1.cpp', line 2708) …


Принимая во внимание, что следующий код дает ожидаемое сообщение об ошибке:

    struct SOMETHINGOROTHER {};
    typedef int SOMETHINGOROTHER;

> 'SOMETHINGOROTHER' : redefinition; different basic types


Очевидно, что проблема в процедуре обработки структуры компилятора.

Интересно, будет ли VS2005 + лучше…

2 голосов
/ 04 декабря 2008

Упс, забыл 'e' в typedef и разбил компилятор.

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
1 голос
/ 12 октября 2008

На моей предыдущей работе у нас был симулятор, который был печально известен тем, что мог сбивать компиляторы (ICE) или заставлять их генерировать неправильный код. И когда код действительно был сгенерирован правильно, компилятору часто приходилось 15 минут для одного исходного файла. Visual Studio никогда (пока я там работал) не мог собрать ядро ​​симулятора.

Ядро было автоматически сгенерировано из DSL, и сгенерированный код часто выдвигал компилятор к своим пределам.

Обновление до новой версии GCC часто вызывало нервозность: будет ли работать новая версия?

1 голос
/ 12 октября 2008

В версии 1.2.x компилятор Mono C # довольно сильно зависал бы со сложным кодом (если я правильно помню, вложенные анонимные делегаты). К счастью, с выпуском 2.x я не видел сбоев.

1 голос
/ 04 декабря 2008

Ранее я разбил компилятор, запустив его из памяти.

Дайте DOS-компилятору около 0,5 Мбайт исходного кода. Хруст.

1 голос
/ 12 октября 2008

В проекте, в котором я работал, некоторые конкретные выражения Boost Lambda могли привести к сбою компилятора Visual C ++. (Мы использовали Visual Studio 2003)
Компилятор будет падать только во время сборки релиза, отладочная сборка будет работать нормально.

В команде разгорелась религиозная война по поводу правильного использования лямбда-библиотек, я был почти благодарен, что компилятор согласился на нас. : -)

1 голос
/ 22 октября 2008

Благодаря @ Ника это приводит к сбою VS2005.

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

 int main()
 {
    return operator_cast<int>(0);
 }
1 голос
/ 10 апреля 2010

Я использую pcc и gcc для компиляции моего старого проекта ОС.

Я обнаружил ошибку, связанную с тем, что pcc и gcc обрабатывают нетривиальный кусок кода, и это приводит к сбою pcc. (символы подписаны на моей платформе)

struct{
  char myvalue:1;
}mystruct;

pcc потерпел крах, потому что все значения битового поля должны быть int, поэтому он действительно более глючный, но gcc обрабатывает его неправильно. Видите ли, если вы думаете об этом, он подписан, но есть место только для одного бита. Поэтому он может хранить только 0 и -1. Хорошо, gcc обрабатывает это неправильно, сохраняя 0 или 1.

...