Вы когда-нибудь разбивали компилятор?

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

У меня была изрядная доля «внутренних ошибок компилятора», но большинство из них исчезли просто при повторной компиляции. У вас есть (минимальный) фрагмент кода, который приводит к сбою компилятора?


person Community    schedule 11.10.2008    source источник
comment
Конечно, бывает, что компилятор тоже программный. Страшнее становится, когда умирает отладчик.   -  person unexist    schedule 12.10.2008


Ответы (39)


Я пишу компилятор, который мы используем, поэтому иногда он дает сбой.

person Community    schedule 11.10.2008

легкий.

// -*- 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>`.
person Community    schedule 11.10.2008
comment
Meh; использование шаблонов дешево. ;-) - person Edward Z. Yang; 12.10.2008
comment
Хех, использовать C ++ дешево ;-) ;-) - person mfx; 07.05.2009
comment
У меня больше не вылетает g ++ 4.2 на Mac. - person kennytm; 10.04.2010

Я еще не сделал сбой GHC (компилятора Haskell), но я исправил ошибку с помощью

My brain just exploded.
I can't handle pattern bindings for existentially-quantified constructors.

Это довольно легко обойти, и вы не попадете в это, если у вас нет сложного (и обычно неправильного) дизайна, но это, вероятно, будет лучшим сообщением об ошибке компилятора когда-либо.

person Community    schedule 12.10.2008
comment
На Аде моя любимая жалоба на соседи омофона. - person Dave; 24.09.2009

VC теперь ловко ловит это, но в середине 90-х это привело бы к сбою компиляторов Microsoft C ++ и Borland C ++:

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


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

Перегруженный оператор-> по своей сути рекурсивен. Ожидается, что функция вернет указатель, к которому снова применяется oper->. Этот фрагмент сделал генерацию кода бесконечно рекурсивной.

person Community    schedule 11.10.2008

ActionScript 3.0:

switch(on_some_variable)
{
}

Пустой выключатель = Баба!

person Community    schedule 11.10.2008
comment
Я не сбой ни компилятор Flash IDE, ни FlashDevelop (с использованием оболочки компилятора Flex из SDK 3.0.1.1732). Может это был баг в более старой версии? - person Juan Pablo Califano; 12.10.2008

Visual C ++ 9.0 с пакетом обновления 1 (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 ==========
person Community    schedule 13.10.2008
comment
ну, похоже, форматтер уценки просто разбил мое чтение там. - person jokoon; 23.09.2010

Что ж, на самом деле это не привело к сбою компилятора - это была просто ошибка, из-за которой VC ++ не принимал идеально хороший код. (подробности приведены здесь).

Странным в этом было то, что он сработал только тогда, когда были выполнены все три довольно непонятных условия. Перемещение одной строчки кода - все, что требовалось для эффективного обходного пути. И одним из необходимых предварительных условий было «использование пространства имен std;» который широко не приветствуется в производственном коде.

Тем не менее сообщения с вопросом, как решить проблему, были постоянным продуктом групп новостей Microsoft VC ++. Я не мог понять, как много людей наткнулись на непонятную ошибку. В конце концов, я кое-кого спросил ...

Точный код, необходимый для запуска ошибки, был приведен в примере Страуструпа «Язык программирования C ++». (*)

(*) Заметьте, я не говорю, что он сделал это специально. Я уверен, что он тестировал его под UNIX-вариантом C ++ и совершенно не подозревал о его влиянии на VC ++.

person Community    schedule 13.10.2008
comment
Я вижу, что Microsoft всегда занималась созданием качественных компиляторов. ^ _ ^ - person Justin Time - Reinstate Monica; 01.07.2016

Я видел несколько ошибок компилятора в компиляторе C # (все крайние случаи, все сообщалось надлежащим образом) и подтвердил некоторые сбои, спровоцированные другими людьми.

Самая страшная ошибка компилятора (в своем роде), с которой я столкнулся, была ошибка JIT в одной из версий Java. Это было вполне воспроизводимо, но приводило к отказу ВМ. Добавление практически бесполезного оператора (я не могу точно вспомнить, что насквозь - возможно, просто объявив дополнительную локальную переменную с начальным значением) отодвинуло его от любого углового случая - и это было исправлено в более поздней версии.

person Community    schedule 11.10.2008
comment
Коллега обнаружил сбой в JIT .net с 3.5 SP1, который был проверен MS - достаточно простого использования дженериков было достаточно, чтобы заставить его умереть на некоторых платформах - следует ли нам беспокоиться, что наши приложения подвержены ошибкам оптимизации JIT. пакетами обновлений на пользовательской машине? (Я считаю, что семейный пакет исправил это) - person morechilli; 07.05.2009
comment
Только настолько, насколько вы должны быть обеспокоены тем, что пакеты обновления могут также сломать части Win32 API или основные функции операционной системы. На самом деле это почти то же самое. - person Jon Skeet; 07.05.2009

Это привело к сбою C64 BASIC:

PRINT 0 + "" +- 0
person Community    schedule 12.10.2008

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

person Community    schedule 11.10.2008

Visual C ++ 5. - сказал Нафф.

person Community    schedule 11.10.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
person Community    schedule 04.12.2008

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

struct PATTERN {
  …
};

Оказывается, проблема заключалась в том, что имя структуры, которое я пытался определить (ШАБЛОН), уже было определением типа в 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 +…

person Community    schedule 09.04.2010

Вот способ вывести из строя компилятор VS2003 C ++.

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

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

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

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

person Community    schedule 22.09.2010

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

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

person Community    schedule 12.10.2008

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

person Community    schedule 12.10.2008
comment
Я тоже ударил по нему несколько раз. Все, что использует анонимные делегаты, может быть проблемой. - person Mark Bessey; 12.10.2008

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

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

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

person Community    schedule 12.10.2008

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

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

 int main()
 {
    return operator_cast<int>(0);
 }
person Community    schedule 22.10.2008

Раньше я разбивал компилятор из-за нехватки памяти.

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

person Community    schedule 04.12.2008

Когда вы получаете сообщение «Catastrophic Failure», значит, вы пытаетесь ....

Майкл

person Community    schedule 27.01.2009

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

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

struct{
  char myvalue:1;
}mystruct;

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

person Community    schedule 09.04.2010

VC ++ вылетал у меня при компиляции C ++, если использование шаблона было неправильным (например, пропущено закрывающее ">").

person Community    schedule 11.10.2008

Я сделал. Некоторые версии Delphi (скажем, №4) очень часто вылетали с загадочными сообщениями об ошибках.

Новые версии (2006 г. и новее) стабильны, но не надежны. (7 в этом случае было здорово).

Сбои компилятора часто происходят при больших изменениях и сеансах отладки сложных проектов (много dll). В большинстве случаев достаточно перезапуска ide. Но иногда требуется перезагрузка ПК.

О и я однажды разбили OS2 вместе с компилятором, потому что файл подкачки стал слишком большим.

person Community    schedule 11.10.2008

Однажды, когда я использовал пример генераторов из документации Python, он сломал версию Python, которую мы использовали. На той же неделе одному из моих коллег удалось неправильно использовать FFI, так что любое вычисление, включающее число 3, привело бы к сбою python.

person Community    schedule 11.10.2008
comment
это привело к появлению желтого - person Tanj; 12.10.2008

Компилятор Microsoft Xbox 360 может легко дать сбой. Мне был предоставлен исходный код с комментариями на японском языке, и при преобразовании в обычный текст одним из последних символов в строке был '\', поэтому комментарий продолжился на следующей строке. Если следующей строкой была команда переключения, то компилятор выйдет из строя.

//wierd japanese characters here %^$$\
switch(n)
{
case 0:
    .....
break;
case 1:
    .....
break;
}
person Community    schedule 12.10.2008

Я много раз разбивал Delphi 7, прося его скомпилировать устаревший код dos.

Похоже, что главным виновником является любая квалификация чего-либо как находящегося в системном блоке. Это не всегда взрывает его, но когда он взрывается на таких вещах, я просматриваю и переписываю все, что требует такого переопределения, и проблема исчезает.

Взрывы воспроизводимы на 100%, но мне никогда не удавалось создать простой тестовый пример. На самом деле в большинстве случаев это не приводит к сбою компилятора, вы обычно получаете ошибку, которая не имеет ничего общего с проблемой и может состоять из сотен строк от нее. Окружение дестабилизировано, сохранение и выход в порядке, но не думайте ни о чем другом.

Еще в каменном веке с Borland Pascal 7 (последней версией dos) я ломал его много раз. Никаких сбоев, только неправильная и непоследовательная эмиссия кода. Я наконец научился держать .EXE (не считая отладочной информации) ниже 3 МБ. Чем дальше я заходил, тем нестабильнее становилось.

person Community    schedule 12.10.2008

Я несколько раз ломал VC ++, обычно с кодом шаблона. Но это не самая интересная авария ...

Я разбил компилятор VS2005 Team System с параметром / analysis, компилируя мою общую библиотеку кода, которая скомпилировалась без ошибок без переключателя, и на VS2008 с переключателем и без него. Конечно, MS не очень интересовалась, потому что это была ошибка в старой версии компилятора, но я подумал, что это было довольно интересно.

person Community    schedule 12.10.2008

Мне удалось отключить интерпретатор Python. Конечно, в то время я работал над расширением C и получал его не совсем правильно.

person Community    schedule 22.10.2008

Это происходит не так часто, как раньше, но иногда с прекомпилятором ASP.net возникают проблемы - я не видел этого лично, но однажды я исправил проблему в другом проекте, где у них были конфликты имен, потому что они не были правильное использование пространств имен (вызвало сбои компилятора) во время предварительной компиляции.

В старые добрые времена (неуправляемый MSVC ++) у нас был странный сбой компилятора, обычно из-за связывания внешних статических классов win32 (.lib), и пара нечетных битов кода иногда вызывала проблемы, но все они были обнаружены очень быстро.

person Community    schedule 04.12.2008

Не знаю, могу ли я назвать это сбоем, но sdcc (Компилятор C для малых устройств) не удается скомпилировать код, сформированный определенным образом:

  • Цель: 8051
  • Код должен был выполняться в 512-байтовом кеше, загруженном из внешнего тестера.
  • Тестер контролирует и хранит код - кеш не может получить следующую страницу
  • Вызов функций не разрешен - ПК (счетчик программ) перейдет к месту, не находящемуся в кэше; макросы препроцессора использовались для выполнения практики модульного кодирования
  • Прыжки (ветвления) разрешены, если он не выходит из кеша
  • Никаких константных значений - в разделе данных программного кода, который заставляет код в кеше извлекать что-то не в кеше - константа препроцессора (#define) ОК здесь

Макросы препроцессора разворачиваются, в результате получается плоский, но большой код - все в main (); выполнение пропускает код запуска (настройка стека и т. д.) и начинается с начала main ()

Соответствующая часть этого ответа:

Иногда sdcc отказывался компилировать синтаксически правильный код с сообщением о нехватке памяти. Это происходило даже при компиляции на 64-битных коробках с 8 ГБ ОЗУ.

Решением в этих случаях было разделить прошивку на отдельные части, скомпилировать их отдельно и выполнить отдельно. Части могли быть соединены вместе, но на тот момент это не имело значения.

Я не пробовал, но компилятор Keil 8051, вероятно, мог бы справиться с проблемным кодом.

person Community    schedule 04.12.2008

Мне несколько раз удавалось вылетать из компилятора F #; но это нечестно, поскольку это был компилятор beta / alpha / research / etc.

person Community    schedule 04.12.2008

Я никогда не пробовал вызвать сбой компилятора, но компилятор / отладчик VB выходил из строя несколько раз в день. Даже если это VB, это считается?

person Community    schedule 27.01.2009
comment
Только если вы объясните, как вы это сделали. - person recursive; 12.03.2009

Моя команда часто имела случайные внутренние ошибки компилятора с компилятором csharp на наших машинах сборки. Мы решили проблему, очистив все папки bin / obj между сборками каждой цели.

person Community    schedule 12.03.2009

У меня произошел сбой VVIS при компиляции карты для движка Source.

Это считается?

person Community    schedule 07.05.2009

Давным-давно я работал над COBOL на компьютере Control Data. (Если это звучит забавно, это так. Control Data была известна своими высокопроизводительными научными вычислительными системами, а компилятор COBOL был немного запоздалым.) Я не помню деталей, но у меня была программа, которую я пробовал портировать на более новую версию. Я пробовал несколько разных способов и обнаружил, что у меня есть выбор между аварийным завершением компилятора или его переводом в бесконечный цикл.

person Community    schedule 09.04.2010

Не компилятор, а компоновщик в Visual Studio 2008 дает сбой несколько раз в день для меня под 64-разрядной версией Windows 7. Сразу же строительство снова всегда работает без сбоев. Microsoft, похоже, не волнует ...

Не совсем ответ на ваш вопрос, потому что это не сам код, вызывающий это, но я всегда готов разглагольствовать об этой конкретной проблеме :-)

person Community    schedule 09.04.2010

Поддержка шаблонов в GCC 2.95 (хотя, возможно, я неправильно запомнил версию) была ошибочной. Различные конструкции могут вызвать сбой. Я не могу найти тестовый пример, но я думаю, что внутренние классы шаблонов (или внутренние классы, которые были шаблонами) были одним из способов получения ошибки компилятора.

person Community    schedule 09.04.2010

У меня было кое-что поинтереснее: внутренняя ошибка компоновщика ...

Вы знаете, как вызвать ЭТО?

person Community    schedule 18.04.2010

Однажды я написал программу на языке C, которая заставляла компьютер самопроизвольно перезагружаться. Одним из недостатков является то, что на самом деле это не имело ничего общего с сортировкой слиянием, которую я пытался реализовать в то время.

К счастью, это исчезло, как только я выяснил свои ошибки указателя.

person Community    schedule 22.09.2010