Napisz doskonale legalny kod w wybranym przez siebie dobrym języku, którego kompilacja albo zawiesi kompilator, albo wyśle go do nieskończonej pętli (nieskończony czas kompilacji).
Ograniczenia:
- Użyj standardowego języka, który jest używany w prawdziwym świecie.
- Użyj standardowego, dobrze rozwiniętego kompilatora (brak odpowiedzi typu „Napisałem mój kompilator C, który ulega awarii na wszystkim”).
- Kod musi być legalny w języku (więc najprawdopodobniej będziesz musiał wykorzystać kompilator lub błąd językowy).
- Podaj wersję kompilatora i użyte opcje, aby inni mogli ją replikować.
- Wyjaśnij, dlaczego kompilator się zawiesił, jeśli to możliwe.
Baw się dobrze :)
popularity-contest
compile-time
Petr Pudlák
źródło
źródło
Odpowiedzi:
Jestem prawie pewien, że zostało to teraz naprawione, ale kiedyś można było zawiesić kompilator Java (lub awarię Eclipse), pisząc
http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
Właściwie, zgodnie z tą stroną, kompilator po prostu zawiesi się, a nie zawiesi. Mimo to myślałem, że to niezła zabawa.
źródło
Moje ulubione rozwiązanie dla GHC:
Zarówno dla GHC 6.12.1, jak
ghci Bad.hs
i bezghc Bad.hs
końca zapętlają się. GHC 7.4.1 zapętla się nieskończenie poghc -O2 Bad.hs
uruchomieniu.Objaśnienie:
omega
jest definiowany przy użyciu nieskończonej rekurencji (jedyny sposób, w jaki może on zamieszkać dowolny typ). Inliner kompilatora jestxx
prostą, nierekurencyjną funkcją, więc próbuje wprowadzić go do definicjiomega
. To powoduje(\x@(C x') -> x' x) (C xx)
. Widząc dopasowanie wzorca na konstruktorze, kompilator próbuje go zmniejszyć, otrzymującxx (C xx)
ponownie i zapętlając. Sztuczka polega na tym, że wxx
rzeczywistości jest ona rekurencyjna, ale rekursja jest ukryta w typie danych.Uwaga: podczas pisania układanki zapomniałem, że GHC działa w nieskończonej pętli. Zajęło mi to całą pamięć, rozbiło Firefoksa i ledwo udało mi się go zabić bez twardego resetu.
źródło
Jest to łatwe w każdym języku zależnym od typu . Sprawdzanie typów ogólnych typów zależnych jest nierozstrzygalne, ponieważ może wymagać dowolnie złożonych obliczeń (Turing-complete). Możesz po prostu zakodować w typie zależnym zbyt dużą wartość. Następnie moduł sprawdzania typu wykorzysta całą dostępną pamięć i ulegnie awarii. Na przykład w Coq ReyCharles podaje przykład
Compute 70000.
, który powoduje, że moduł sprawdzania typu konstruuje gigantyczną liczbę Peano i ulega awarii.W bardziej popularnych językach, które obsługują pewnego rodzaju ekspansję makr lub metaprogramowanie, możesz zrobić coś podobnego. Na przykład możesz użyć całej dostępnej pamięci w C:
Język programowania D umożliwia wykonywanie funkcji czasu kompilacji . Można to wykorzystać do obliczenia czegoś, co w czasie kompilacji jest zbyt duże, aby zmieścić się w pamięci. Coś podobnego można osiągnąć za pomocą metaprogramowania szablonów C ++.
W języku XML (nieskompilowanym języku programowania, ale procesor XML jest analogiczny do kompilatora), rozwijanie jednostek może powodować brak pamięci procesora:
Nazywa się to atakiem miliardów śmiechu .
źródło
<lolz>&lol999;</lolz>
śmieje się 10 999, a nie miliard. Powiązane odniesienia wykorzystują<lolz>&lol9;</lolz>
, co w rzeczywistości jest miliardem.DO#
Znaleziono to w pytaniu dotyczącym przepływu stosu :
Kompilator ostatecznie się zawiesi.
Problem wydaje się dotyczyć wnioskowania typu i / lub generacji lambda w połączeniu z rozdzielczością przeciążenia.
źródło
VBA
co powiesz na to, czy możesz zawiesić IDE, wpisując kod?
w dowolnej aplikacji Microsoft Office, spróbuj tego:
ALT+, F11aby przejść do okna VBA, a następnie wypróbuj następujący kod
I oto:
Możesz po prostu wpisać
redim preserve v(,1 to 5)
w bezpośrednie okno, a po naciśnięciu zawiesi się ENTER!źródło
,
i oczekiwane,
)Perl (15)
To tworzy nieskończoną pętlę w czasie kompilacji :
(z perlmod )
I dlatego Perl nie jest w stanie dokończyć parsowania kodu. To nie kończy:
źródło
jot
To powoduje awarię interpretera języka J (przynajmniej w systemie Linux):
Próbuje czytać z adresu pamięci 2. Co ciekawe, jeśli spróbujesz z 0 lub 1, dostaniesz
domain error
.źródło
TeX
TeX jest językiem makropoleceń. Tutaj definiujemy rozszerzenie makra,
\x
aby było\x
ponownie, a następnie dodajemy wywołanie\x
. TeX utknie w nieskończoność wymianie\x
z\x
.źródło
Schemat
Mój kompilator, Chicken, popełnił błąd, próbując rozwinąć makra w czasie kompilacji dla „wydajności w czasie wykonywania” lub coś w tym rodzaju. Więc zapłacił cenę za rozszerzenie tego. Przeczytałem R5RS. Nikt nie powiedział, że makra musiały zostać rozszerzone w czasie kompilacji.
Zasadniczo to, co się dzieje, to makro rozwija się w ekspresję o nieskończonym rozmiarze, stale podwajając rozmiar. Cóż, żeby być technicznym, podwajając każde inne rozszerzenie. Los kompilatora jest przesądzony. Przynajmniej w moim systemie, czapki z kurczaka o pojemności 2 GB, długo się zatrzymują, próbując wyrzucić śmieci, a potem się zawieszają, gdy śmieciarz się poddaje. Zajmuje to jednak trochę czasu ze względu na całą kosztowną obliczeniowo higieniczną magię.
Przełączanie między wyrażeniami formularza
i
wydaje się bardzo, bardzo dramatycznie zwiększyć tempo zużycia pamięci w porównaniu do:
Podejrzewam, że Chicken jest dość odpornym kompilatorem, który ma pewne sposoby na uniknięcie dogłębnej analizy wyrażeń składniowych, kiedy może uciec, ale moje ostateczne rozwiązanie zmusza dopasowującego wzorzec do zagłębiania się.
źródło
@wizzwizz4
.Common Lisp
Makra ułatwiają:
Kompilowanie
compile-me
wywołańloop-forever
, które wyczerpuje pamięć sterty podczas jej rozszerzania i powoduje awarię kompilatora. Jeśli chcesz, aby kompilator zawiesił się na czas nieokreślony, toloop-forever
zrobi to ta definicja :Powinno to działać przy użyciu dowolnej implementacji CL, chyba że twoja jest wyjątkowo sprytna i potrafi wykryć proste nieskończone pętle, ale poważnie wątpię, żeby to zrobiła. Oczywiście pełna ochrona przed tym jest niemożliwa.
źródło
(defmacro loop-forever () (loop)) (defun compile-me () (loop-forever))
powinno wystarczyć. Wisi dla mnie CCL.PHP 5.3.1 (interpreter Segfaults) ( Bug 50261 , naprawiony w 5.3.3)
Ten był trochę problemem, ponieważ powyższy kod był powszechny w wielu kodach, z którymi pracowałem, dzięki czemu jest to dla nas dość rozpowszechniony problem.
(Jeśli dobrze pamiętam, w pewnym momencie był to jedyny sposób wywoływania konstruktorów nadrzędnych w PHP).
źródło
re
(DMD32 D Compiler v2.067.1, kompilacja Windows)
Zauważ, że spowoduje to wysłanie kompilatora do nieskończonej pętli i zawieszenie go.
Mechaniczny ślimak zasugerował, że w tym celu można nadużywać funkcji programowania w czasie kompilacji w D, ale rozwiązanie jest być może prostsze niż techniki, które miał na myśli.
Dla tych, którzy nie są zaznajomieni z „miksami łańcuchowymi”, jest to dość prosta funkcja makr. Gdy kompilator napotka
mixin("asdf")
, zastępuje go zawartością ciąguasdf
i próbuje go skompilować ponownie.Powyższe rozwiązanie zostanie rozszerzone w następujący sposób:
Więc jeśli kompilator nie spróbuje wykryć tego przypadku rozwijania do tego samego, przejdzie do nieskończonej pętli rozszerzenia.
źródło
Perl
Definiuje to przeciążenie operatora w czasie kompilacji i uruchamia kod w czasie kompilacji, który dodaje instancje klasy razem.
(nawiasem mówiąc, normalnie nieskończona rekurencja zjadłaby całą pamięć, ale przy przeciążeniu po prostu ulega awarii)
Wynik:
źródło
Simplex v.0.5 , 2 bajty
Szkoda, że to nie jest golf golfowy :
Pozwól mi wyjaśnić. Z dokumentów:
Więc:
Zewnętrzny program jest fajną małą funkcją w Simplex: jest oceniany na końcu programu. Więc jeśli będziemy śledzić ...:
W końcu skończy się pamięć i świat się skończy.
źródło
Clang ++
Właśnie natknąłem się na ten zabawny błąd.
Celem jest przetłumaczenie Brainfuck na C, przy użyciu meta-programowania szablonów, aby wykonać większość pracy. Ten kod działa dla mniejszych programów Brainfuck, takich jak Hello World, ale kiedy próbowałem uruchomić go z 99 butelkami ...
Z powodzeniem skompiluje się w GCC (po około 2 minutach), ale połączenie go powoduje inny problem ...
Ups
źródło
Smalltalk (piskliwy dialekt, wersja 4.x)
Bardzo łatwo, po prostu oceń to, lub zaakceptuj metodę z tym dosłownym
Spróbuje ocenić moc 10 w arytmetyki dużej liczby całkowitej, tylko dla poprawnego zaokrąglenia inf Tsss;)
Edycja: ile 9 jest potrzebnych?
Ponieważ 2 ^ 10 wynosi 1024, około 10 ^ 3, możemy z grubsza przybliżać 10 ^ n przez 2 ^ (10 * n / 3). Oznacza to, że 10 ^ n wymaga 10 * n / 3 bitów do binarnego przedstawienia. Chcielibyśmy, aby 10 ^ n nie było reprezentatywne.
Zakładając 32-bitowe wskaźniki dla pamięci obiektów, wiemy, że nie możemy adresować więcej niż 2 ^ 32 bajty, czyli 2 ^ 35 bitów. Więc odwróćmy problem: 2 ^ 35 wynosi około 32 * 2 ^ 30, 32 * 10 ^ 9. Wymaga to około 11 cyfr dziesiętnych, więc z jedenastoma 9, z pewnością wygenerujemy błąd przy 32-bitowym pisku. W 64 bitach byłoby to dwadzieścia jeden 9.
Możemy również wyczerpać pamięć za pomocą mniejszych 9s, cała przestrzeń adresowalna niekoniecznie jest dostępna, ale testowanie jej jest śmiertelnie powolne, Squeak VM nie jest zoptymalizowany do tak gigantycznej arytmetyki w przeciwieństwie do GMP.
źródło
9
sekund?Oto moja oryginalna i zwięzła metoda na awarię GolfScript:
W ten sposób powstaje wieczna pętla, która ciągle wypycha 1 na stos aż do wyczerpania się pamięci.
W C / C ++ uważam, że ten oryginalny fragment kodu spowodowałby awarię kompilatora:
Spowoduje to, że kompilator utknie podwojono liczbę a i zamieni je na b i odwrotnie, więc wkrótce kompilatorowi zabraknie pamięci i nastąpi awaria.
Innym jest wsadowy w systemie Windows, jeśli liczy się całkowicie zamrożenie komputera, a nie tylko sam skrypt wsadowy. Powinieneś wpisać następujące informacje:
To wchodzi w nieskończoną pętlę robienia kopii siebie, które tworzą kopie siebie i tak dalej. Najprawdopodobniej doprowadziłoby to do awarii twojego komputera, gdybyś uruchomił ten kawałek kodu.
Ostatni jest bombą VBS. Jest to kolejna bomba, podobnie jak ostatnia, ale zamiast tego otwiera nieskończoną liczbę okien dialogowych.
Powoduje to ciągłe tworzenie kopii samego siebie i otwiera okno komunikatu w nieskończonej pętli, co robią również klony. Uruchamianie tych dwóch ostatnich programów nie jest zalecane, ponieważ mogą one spowodować zawieszenie się komputera i konieczność twardego uruchomienia komputera.
Zauważ, że sam wymyśliłem wszystkie te programy.
źródło
Common Lisp, 8 bajtów
Krótszy niż inna odpowiedź Common Lisp :-)
Pętla podczas czytania formularza.
Standard Common Lisp nie wspomina o przenośnym sposobie powodowania awarii, więc myślę, że musimy mieć sposób zdefiniowany w implementacji. Nadal 8 bajtów:
... lub
Gdy dzwonisz
(compile-file "crash.lisp")
, środowiska w tajemniczy sposób „upaść”.Żartując, wciąż próbuję znaleźć sposób, aby naprawdę zniszczyć środowisko (i wkrótce), ale to naprawdę trudne. Wszystko, co dostaję, to miła interakcja z debuggerem.
źródło
x86 asm
„nasm -v” zwraca „NASM wersja 2.11.08 skompilowana 21 lutego 2015 r.” (Używam go pod Win7)
Asembler działa do tej pory na 1:12:27 na i7, całkowicie nasycając jeden z rdzeni. Plik wyjściowy ma 0 bajtów, zużycie pamięci jest stabilne na poziomie 1004K - wydaje się, że bezpiecznie jest powiedzieć, że pobiłem nasm, zamiast po prostu dać mu naprawdę, bardzo długie zadanie. :)
Kluczem do lewy jest powtórzenie wartości w makrze - 0xFFFFFFFF. Chociaż nie znam wystarczająco wewnętrznych elementów Nasm, aby wiedzieć, dlaczego dokładnie to dusi. Oczekiwałem, że otrzymam około 16 GB wyjścia godzinę temu.
EDYCJA: Właśnie sprawdziłem menedżera zadań, Nasm działa od 7:40:41, a pamięć jest teraz do 1016 KB
źródło
Asembler GNU, generujący ogromne pliki wyjściowe
To makro próbuje wypełnić plik wyjściowy śmieciami (zwykle bajty zerowe), dopóki nie zostanie osiągnięta granica 4 GB, dodaje liczbę całkowitą, aby przekroczyć tę granicę, i rekurencyjnie wywołuje siebie, aby nadal wypełniać dane wyjściowe kawałkami śmieci 4 GB. Spowoduje to zapełnienie dysku twardego, dopóki nie będzie pełny, w którym momencie asembler prawdopodobnie się zawiesi.
Zauważ, że nie można użyć nieskończonej rekurencji, ponieważ asembler złapie ten specjalny przypadek i przestanie rozwijać makro.
Kompilacji można dokonać
as -o crash.out crash.s
w większości dystrybucji Linuksa.źródło
Common Lisp, 29 bajtów
Realizacja: Clozure CL
OSTRZEŻENIE: Zachowaj ostrożność podczas uruchamiania tego kodu, może zabić procesy, których nie chcesz!
Spowoduje to uruchomienie polecenia powłoki
pkill cl
w czasie kompilacji, co zabije proces Lisp podczas kompilacji. Technicznie nie jest to awaria, ale ma ten sam efekt.Przykładowe użycie:
źródło
Felix
To już nie działa, ale w pewnym momencie ten kod:
Dałoby to duży błąd:
BŁĄD SYSTEMU wyrażenie_wyrażenia 'podniesione Not_found [BŁĄD] Kompilacja Felixa "/ media / ryan / stuff / felix / build / release / host / bin / flxg" "-q" "--optimise" "--inline = 100" "- katalog_wyjściowy = / home / ryan / stuff / .felix / text "" - katalog_cache = / 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 / share / lib / grammar / grammar.files / syntax.automaton” ”--import = plat / flx.flxh "" std "" /home/ryan/golf/itri/sl.flx "nie powiodło się Błąd 1 we flx: [strerror_r] Nie można znaleźć tekstu dla błędu numer 1
Problem był tutaj:
let
spodziewałam się, że podąży za nim wyrażenie, ale zamiast tego wstawiłem oświadczenie. Tak więc kompilator trochę wystraszył.Więcej informacji na https://groups.google.com/forum/m/#!topic/felix-language/J3Hs4j6E0gM .
źródło
JavaScript
To wysyła go w nieskończoną pętlę. Użyłem kompilatora Codecademy JS, który spowodował awarię przeglądarki.
źródło
while(1){}
; jest to również nieskończona pętla.while(1);
.JavaScript
Ten powoduje awarię przeglądarek internetowych w bardzo skuteczny sposób. UŻYWAJ NA WŁASNE RYZYKO !!!
źródło
Potasu
Plik1 ma:
File2.has:
Powoduje to, że ładuje się i rozpoczyna kompilację pliku File2.has, co nakazuje mu załadowanie pliku File1.has, co powoduje załadowanie pliku File2.has i tak dalej.
źródło
LOLCODE 1.2, LOLCODE Common Interpreter / Compiler (lci)
Wiem, że to nie jest golf golfowy, ale i tak jest wyjątkowo krótki.
To powoduje, że Signal 11:
Dlaczego?
HAI1.2
oznacza początek programu iOBTW
inicjuje komentarz wielowierszowy. Ale kompilator spodziewa sięKTHXBYE
, aby zamknąćHAI
iTLDR
zamknąć wielowierszowego komentarza.Zauważ, że to nadal będzie działać, powodując segfault z czymkolwiek innym niż
TLDR
poOBTW
.(Zgodnie ze standardami wikipedii LOLCODE jest po prostu Dziwakiem, a nie ezoterycznym.)
Możesz pobrać tłumacza z git / justinmeza / lci .
źródło