Напишите совершенно законный код на достойном языке по вашему выбору, компиляция которого приведет к сбою компилятора или отправит его в бесконечный цикл (бесконечное время компиляции).
Ограничения:
- Используйте стандартный язык, который используется в реальном мире.
- Используйте стандартный, хорошо разработанный компилятор (без ответов типа «Я написал свой компилятор C, который падает на все»).
- Код должен быть допустимым на языке (поэтому, скорее всего, вам придется использовать компилятор или языковую ошибку).
- Укажите версию своего компилятора и используемые параметры, чтобы другие могли ее воспроизвести.
- Объясните, почему произошел сбой компилятора, если это возможно.
Повеселись :)
popularity-contest
compile-time
Петр Пудлак
источник
источник
Ответы:
Я почти уверен, что теперь это исправлено, но раньше было так, что вы могли аварийно завершить работу Java-компилятора (или Eclipse), написав
http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
На самом деле, согласно этой странице, компилятор будет зависать, а не падать. Тем не менее, я думал, что это было довольно весело.
источник
Мое любимое решение для GHC:
Для GHC 6.12.1 и то
ghci Bad.hs
и другоеghc Bad.hs
бесконечно. GHC 7.4.1 зацикливается бесконечно, когдаghc -O2 Bad.hs
выполняется.Объяснение:
omega
определяется с помощью бесконечной рекурсии (единственный способ, которым она может обитать в любом типе). Инлайнер компилятора видитxx
простую нерекурсивную функцию, поэтому он пытается включить ее в определениеomega
. Это приводит к(\x@(C x') -> x' x) (C xx)
. Видя совпадение с образцом в конструкторе, компилятор пытается уменьшить его, получаяxx (C xx)
снова и циклы. Хитрость в том, чтоxx
это на самом деле рекурсивно, но рекурсия скрыта в типе данных.Примечание: во время написания головоломки я забыл, что оставил GHC в бесконечном цикле. Это заняло всю мою память, рухнул Firefox, и мне едва удалось убить его без полной перезагрузки.
источник
Это легко на любом языке с зависимой типизацией . Проверка типов общих зависимых типов неразрешима, поскольку может потребовать сколь угодно сложных вычислений (полный по Тьюрингу). Вы можете просто закодировать в зависимом типе слишком большое значение. Затем проверка типов будет использовать всю доступную память и сбой. Например, в Coq ReyCharles приводит пример того
Compute 70000.
, что средство проверки типов создает гигантскую цифру Пеано и вылетает.В более распространенных языках, которые поддерживают расширение макросов или метапрограммирование, вы можете сделать что-то подобное. Например, вы можете использовать всю доступную память в C:
Язык программирования D позволяет выполнять функции во время компиляции . Это может быть использовано для вычисления чего-то во время компиляции, которое слишком велико для размещения в памяти. Нечто подобное можно достичь с помощью метапрограммирования шаблонов C ++.
В XML (не скомпилированный язык программирования, а XML-процессор аналогичен компилятору), расширяющиеся объекты могут заставить процессор исчерпать память:
Это называется атакой миллиарда смеха .
источник
<lolz>&lol999;</lolz>
10 ^ 999 смеется, а не миллиард. Связанные ссылки использует<lolz>&lol9;</lolz>
, что на самом деле миллиард.C #
Нашел это по вопросу stackoverflow :
Компилятор в конце концов потерпит крах.
Кажется, проблема связана с выводом типа и / или генерацией лямбды в сочетании с разрешением перегрузки.
источник
VBA
Как насчет того, если вы можете разбить IDE, введя код?
в любом приложении Microsoft Office попробуйте это:
ALT+ F11чтобы попасть в окно VBA, попробуйте следующий код
и вот:
Вы можете просто напечатать
redim preserve v(,1 to 5)
в ближайшем окне, и оно будет падать после нажатия ENTER!источник
,
и ожидается,
)Perl (15)
Это создает бесконечный цикл во время компиляции :
(от perlmod )
И именно поэтому Perl не может завершить анализ кода. Это не заканчивается:
источник
J
Это segfaults интерпретатор J (по крайней мере, в Linux):
Он пытается прочитать из памяти адрес 2. Интересно, что если вы попробуете это с 0 или 1, вы получите
domain error
.источник
TeX
TeX - это язык макро-расширения. Здесь мы определяем расширение макроса,
\x
чтобы оно было\x
снова, а затем добавляем вызов\x
. TeX застревает бесконечно замены\x
с\x
.источник
Схема
Мой компилятор, Chicken, сделал ошибку, пытаясь расширить макросы во время компиляции для «производительности во время выполнения» или чего-то еще. Таким образом, он заплатил цену расширения этого. Я читал R5RS. Никто не говорил, что макросы нужно было расширять во время компиляции.
По сути, происходит то, что макрос расширяется до выражения бесконечного размера, постоянно удваивающегося в размере. Ну, чтобы быть техническим, удвоение любого другого расширения. Судьба компилятора решена. По крайней мере, в моей системе, Chicken caps на 2 ГБ, долго зависает, пытаясь собрать мусор, а затем падает после того, как сборщик мусора сдается. Хотя это занимает некоторое время из-за всей вычислительно дорогой гигиенической магии.
Переключение между выражениями формы
а также
кажется, очень, очень резко увеличить скорость потребления памяти по сравнению с:
Я подозреваю, что Chicken - довольно выносливый компилятор, у которого есть несколько способов избежать глубокого анализа синтаксических выражений, когда это может сойти с рук, но мое окончательное решение заставляет анализатор шаблонов действительно погрузиться в это.
источник
@wizzwizz4
.Common Lisp
Макросы облегчают:
Компиляция
compile-me
вызововloop-forever
, которая исчерпывает кучу памяти во время ее расширения и приводит к сбою компилятора. Если вы просто хотите, чтобы компилятор зависал на неопределенное время, то это определениеloop-forever
сделает это:Это должно работать с любой реализацией CL, если только вы не очень умны и не можете обнаружить простые бесконечные циклы, но я серьезно сомневаюсь, что кто-либо сделает это. Полная защита от этого невозможна, конечно.
источник
(defmacro loop-forever () (loop)) (defun compile-me () (loop-forever))
должно быть достаточно. Это висит CCL для меня.PHP 5.3.1 (интерпретатор Segfaults) ( ошибка 50261 , исправлена в 5.3.3)
Это было немного проблемой, потому что приведенный выше код был распространен во многих кодах, с которыми я работал, что делало это довольно распространенной проблемой для нас.
(Если я правильно помню, в какой-то момент это был единственный способ вызвать родительские конструкторы в PHP.)
источник
D
(DMD32 D Compiler v2.067.1, сборка Windows)
Обратите внимание, что это отправит компилятор в бесконечный цикл и вылетит.
Механическая улитка предположила, что для этой цели можно злоупотреблять функциями программирования во время компиляции в D, но решение, возможно, проще, чем те методы, которые он имел в виду.
Для тех, кто не знаком с «строковыми миксинами», это довольно простая функция макроса. Когда компилятор встречается
mixin("asdf")
, он заменяет его содержимым строкиasdf
и пытается снова скомпилировать.Решение выше будет расширено так:
Таким образом, если компилятор не попытается обнаружить этот случай расширения до одного и того же, он войдет в бесконечный цикл расширения.
источник
Perl
Это определяет перегрузку оператора во время компиляции и запускает код во время компиляции, который добавляет экземпляры класса вместе.
(кстати, обычно бесконечная рекурсия съела бы всю память, но с перегрузкой просто вылетает)
Выход:
источник
Simplex v.0.5 , 2 байта
Жаль, что это не код-гольф :
Позволь мне объяснить. Из документов:
Так:
Внешняя программа - это небольшая удобная функция в Simplex: она оценивается в конце программы. Итак, если мы будем отслеживать ...:
В конце концов, память иссякнет, и мир закончится.
источник
Clang ++
Я только что натолкнулся на эту забавную ошибку.
Цель состоит в том, чтобы перевести Brainfuck на C, используя шаблонное метапрограммирование для выполнения большей части работы. Этот код работает для небольших программ Brainfuck, таких как Hello World, но когда я попытался запустить его с 99 бутылками ...
Он успешно скомпилируется в GCC (примерно через 2 минуты), но его связывание вызывает другую проблему ...
К сожалению.
источник
Smalltalk (писк диалект, версия 4.x)
Очень просто, просто оцените это или примите метод с этим литералом
Он попытается оценить степень 10 в арифметике больших целых чисел, просто для правильного округления inf Tsss;)
Редактировать: сколько нужно 9?
Поскольку 2 ^ 10 равно 1024, то есть приблизительно 10 ^ 3, мы можем приблизительно приблизить 10 ^ n к 2 ^ (10 * n / 3). Это означает, что 10 ^ n требуют, чтобы 10 * n / 3 бита были представлены в двоичном виде. Мы бы хотели, чтобы 10 ^ n не было представлено.
Предполагая 32-битные указатели для памяти объекта, мы знаем, что мы не можем адресовать больше, чем 2 ^ 32 байта, то есть 2 ^ 35 бит. Итак, давайте обратим проблему: 2 ^ 35 - это примерно 32 * 2 ^ 30, 32 * 10 ^ 9. Для этого требуется около 11 десятичных цифр, поэтому с одиннадцатью 9 мы обязательно сгенерируем ошибку на 32-битном скрипе. В 64 битах это будет двадцать один 9.
Мы также можем исчерпать память с меньшим количеством 9 с, все адресуемое пространство не обязательно доступно, но тестировать его крайне медленно, Squeak VM не оптимизирована для такой гигантской арифметики в отличие от GMP.
источник
9
с?Это мой оригинальный и лаконичный метод сбоя GolfScript:
То, что это делает, устанавливает бесконечный цикл, который продолжает помещать 1 в стек до тех пор, пока не закончится память.
В C / C ++ я считаю, что этот оригинальный фрагмент кода может привести к сбою компилятора:
Это заставило бы компилятор удвоить количество a и превратить их в b, и наоборот, так что компилятору очень скоро не хватило бы памяти и произошел сбой.
Другой вариант предназначен для пакетной работы в Windows, если считается, что компьютер полностью зависает, а не только пакетный скрипт. Вы должны ввести следующее:
Это входит в бесконечный цикл создания своих копий, которые делают копии самих себя и так далее. Скорее всего, это в конечном итоге приведет к краху вашего компьютера, если вы запустите этот маленький кусочек кода.
Последний - бомба VBS. Это еще одна бомба, как и последняя, но вместо этого она открывает бесконечное количество диалоговых окон.
Это непрерывно создает свою собственную копию и открывает окно сообщения в бесконечном цикле, что также делают клоны. Запуск этих двух последних программ не рекомендуется, так как они могут заморозить ваш компьютер и заставить вас загружать компьютер.
Обратите внимание, что я сам разработал все эти программы.
источник
Common Lisp, 8 байт
Короче, чем другой ответ Common Lisp :-)
Цикл, читая вашу форму.
Стандарт Common Lisp не упоминает о переносимом способе его сбоя, поэтому я думаю, нам нужен способ, определяемый реализацией. Еще 8 байтов:
... или,
Когда вы звоните
(compile-file "crash.lisp")
, окружение таинственно «вылетает».Помимо шуток, я все еще пытаюсь найти способ действительно разрушить окружающую среду (и в ближайшее время), но это действительно сложно. Все, что я получаю, это хорошее взаимодействие с отладчиком.
источник
x86 asm
«nasm -v» возвращает «NASM версии 2.11.08, скомпилированную 21 февраля 2015 года» (я запускаю его под win7)
Ассемблер до сих пор работает на 1:12:27 на i7, полностью насыщая одно из ядер. Выходной файл занимает 0 байт, потребление памяти стабильно составляет 1 004 Кб - кажется, можно с уверенностью сказать, что я избил нос, а не просто дал ему действительно очень длинную задачу. :)
Ключ к уловке - значение повторения в макросе - 0xFFFFFFFF. Хотя я недостаточно знаком с внутренностями Насма, чтобы понять, почему именно он задыхается от этого. Я ожидал получить выход ~ 16 ГБ час назад.
РЕДАКТИРОВАТЬ: Только что проверил диспетчер задач, Nasm работает 7:40:41 и память до 1 016K
источник
Gnu ассемблер, генерирующий огромные выходные файлы
Этот макрос пытается заполнить выходной файл мусором (обычно нулевыми байтами) до тех пор, пока не будет достигнута граница 4 ГБ, добавляет int, чтобы преодолеть эту границу, и рекурсивно вызывает себя, чтобы продолжать заполнять вывод кусками 4 ГБ мусора. Это заполнит ваш жесткий диск, пока он не заполнится, и в этот момент ассемблер, скорее всего, потерпит крах.
Обратите внимание, что бесконечная рекурсия не может быть использована, поскольку ассемблер перехватит этот особый случай и прекратит расширение макроса.
Компиляция может быть выполнена
as -o crash.out crash.s
в большинстве дистрибутивов Linux.источник
Common Lisp, 29 байт
Реализация: Clozure CL
ВНИМАНИЕ: будьте осторожны при запуске этого кода, он может убить процессы, которые вам не нужны!
Это запускает команду оболочки
pkill cl
во время компиляции, что убивает процесс Lisp, выполняющий компиляцию. Технически не крушение, но оно имеет тот же эффект.Пример использования:
источник
Феликс
Это больше не работает, но в какой-то момент этот код:
Это даст большую ошибку:
SYSTEM FAILURE bind_expression 'поднято Not_found [BUG] Компиляция Феликса "/ media / ryan / stuff / felix / build / release / host / bin / flxg" "-q" "--optimise" "--inline = 100" "- output_dir = / home / ryan / stuff / .felix / text "" --cache_dir = / home / ryan / stuff / .felix / cache "" -I / media / ryan / stuff / felix / build / release / share / lib "" -I / media / ryan / stuff / felix / build / release / host / lib "" --syntax=@/media/ryan/stuff/felix/build/release/share/lib/grammar/grammar.files " "--automaton = / home / ryan / stuff / .felix / cache / media / ryan / stuff / felix / build / release / поделиться / lib / грамматика / grammar.files / syntax.automaton" "--import = plat / flx.flxh "" std "" /home/ryan/golf/itri/sl.flx "не удалось Ошибка 1 во flx: [strerror_r] Не удалось найти текст для ошибки номер 1
Вопрос был здесь:
let
ожидал, что за ним последует выражение, но вместо этого я поставил заявление. Таким образом, компилятор немного испугался.Дополнительная информация по адресу https://groups.google.com/forum/m/#!topic/felix-language/J3Hs4j6E0gM .
источник
JavaScript
Это отправляет его в бесконечный цикл. Я использовал компилятор Codecademy JS, и он сломал мой браузер.
источник
while(1){}
; это тоже бесконечный цикл.while(1);
.Javascript
Это серьезно сбивает веб-браузеры. ИСПОЛЬЗУЙТЕ НА СВОЙ РИСК!!!
источник
гания
File1.has:
File2.has:
Это приводит к тому, что Hodium загружается и начинается компиляция File2.has, что говорит ему о загрузке File1.has, что приводит к загрузке File2.has и так далее.
источник
LOLCODE 1.2, LOLCODE Общий интерпретатор / компилятор (lci)
Я знаю, что это не код-гольф, но в любом случае он очень короткий.
Это вызывает сигнал 11:
Зачем?
HAI1.2
обозначает начало программы иOBTW
инициирует многострочный комментарий. Но компилятор ожидает, что aKTHXBYE
закроетHAI
, и aTLDR
закроет многострочный комментарий.Обратите внимание, что это все еще будет работать, чтобы вызвать segfault с чем-либо, кроме как
TLDR
послеOBTW
.(По стандартам википедии LOLCODE - это просто странный язык, а не эзотерический.)
Вы можете получить переводчик из git / justinmeza / lci .
источник