Szaleństwo: powtarzanie tego samego w kółko i oczekiwanie różnych rezultatów.
Napisz program, który generuje wyjątek (błąd w czasie wykonywania) przy każdym uruchomieniu. Wyzwanie polega na tym, że istnieje prawdopodobieństwo wywołania więcej niż jednej awarii bez bezpośredniego wywoływania wyjątków (bez throw
instrukcji) i nie korzystania z wbudowanych funkcji zliczania losowego lub procesora.
- 10 punktów za każdy możliwy błąd.
- 25 punktów bonusowych, jeśli błąd / awaria wystąpi w innym procesie lub systemie.
Zasady
- Odpowiedzi muszą wskazywać, jakie błędy są możliwe i jak są generowane.
- Nie można użyć systemowego (wbudowanego) generatora liczb losowych, chyba że jest on zapełniany tą samą liczbą przy każdym uruchomieniu programu.
- Nie można użyć liczby cykli tiki lub procesora, chyba że są one liczone w stosunku do początku głównego wątku programu.
- Wielowątkowość jest dozwolona (jeśli nie jest zakodowana).
Edytuj 1
Generowanie identyfikatora GUID należy do wbudowanego generatora liczb losowych. Dozwolone jest niestandardowe generowanie GUID „na miejscu”.
Dostęp do systemu plików jest dozwolony dla operacji we / wy plików, z wyjątkiem sytuacji, gdy wykonano je w celu ominięcia reguł (odczyt pliku losowych bitów lub znacznika czasu).
Edytuj 2
- Wołanie
abort()
lubassert()
łamanie ducha wyzwania związanego z tworzeniem szalonego oprogramowania i dlatego za ten tryb niepowodzenia nie zostanie przyznanych 10 punktów.
Powodzenia!
code-challenge
ja72
źródło
źródło
Odpowiedzi:
Java, 400
Java jest błogosławiona (?) Wieloma
Exception
si iError
s. Istnieje wieleException
specyficznych dla działania jednej klasy. Jako przykład jednego z najbardziej ekstremalnych przypadków, istnieje więcej niż 10Exception
sekund (wszystkie są podklasamiIllegalFormatException
) poświęconychFormatter
samej klasie i poświęciłem trochę czasu, aby kod wygenerował (prawie) wszystkie z nich.Moja obecna odpowiedź zawiera 40 różnych
Exception
s /Error
s i są one losowo wykonywane w zależności od modułuSystem.nanoTime()
z jakąś liczbą całkowitą.Powyższa metoda powinna być dozwolona, ponieważ mieści się w przypadku „3. Nie można użyć liczby cykli tików lub procesorów, chyba że są one liczone względem początku głównego wątku programu” .
Instrukcja kompilacji
JRE / JDK lub OpenJDK firmy Oracle jest zdecydowanie zalecane do uruchamiania kodu. W przeciwnym razie niektóre wyjątki mogą nie zostać zgłoszone, ponieważ niektóre z nich opierają się na wewnętrznych szczegółach implementacji referencyjnej i nie mam wiarygodnego rozwiązania awaryjnego.
Poniższy kod pomyślnie się kompiluje
javac 1.7.0_11
i generuje wszystkie wyjątkijava 1.7.0_51
.Aby uruchomić ten kod, musisz skopiować i wkleić poniższy kod do edytora obsługującego Unicode (np. Notepad ++), zapisać go w UTF-16 (Big-Endian lub Little-Endian nie ma znaczenia, dopóki napisany jest BOM) .
Zmień katalog roboczy (
cd
) na miejsce, w którym zapisany jest kod źródłowy ( jest to ważne ).Skompiluj kod za pomocą następującego polecenia:
I uruchom kod:
W moim kodzie nie ma nic destrukcyjnego, ponieważ chcę również przetestować go na moim komputerze. Najbardziej „niebezpiecznym” kodem jest usuwanie
ToBeRemoved.class
pliku w bieżącym folderze. Poza tym reszta nie dotyka systemu plików ani sieci.Lista wyjątków i błędów
W kolejności zadeklarowanej w instrukcji skrzynki rozdzielczej. Łącznie jest 37
Exception
si 3Error
s.Pattern
, z nudną skrzynką jako kopię zapasową)Pattern
, z nudną skrzynką jako kopię zapasową)Pattern
, z nudną skrzynką jako kopią zapasową)Pattern
, z nudną skrzynką jako kopią zapasową)$
wPattern
można pasujących przed końcowym linii terminatora)Matcher
bez wykonywania dopasowania)split(String regex)
)Exception
podczas inicjowania klasy)java.nio.*
-specyficznejException
)java.nio.*
-specyficznejException
)java.nio.*
-specyficznejException
)java.util.Stack
-specyficznejException
)Charset.isSupported(String name)
zwraca false lub wyrzucaException
)java.util.Scanner
-specyficznejException
)java.util.Formatter
odtąd do 35 są -swoisteException
)SecurityManager
jest użyteczna)Class
klasy)Exception
nie można tego wyrzucić w implementacji Oracle, brak kopii zapasowej)źródło
nanoTime
i pracę wykonaną przy tej odpowiedzi.Java
jest-1 % 40 == -1
lub-1 % 40 = 39
?-1
. Czy dostałeś liczbę ujemną? (Edytowane, aby upewnić się, że wszystko nie jest ujemne).C (Windows 7) - 80 + 25 = 105 punktów
Poniższy program opiera się na ASLR
Następujący wyjątek wystąpiłby losowo
Vector Subscript Out of Range
)Infinite Recursion
Dividing by Zero
Allocating Huge Memory
By Accessing NULL
By overwriting stack
źródło
<iostream>
konieczne?assert()
jest równoznaczne z zgłoszeniem wyjątku.abort
iassert
._crtMessageBoxW
i udaje, że dzwoniraise(SIGABRT)
, co kończy się przezexit(3)
Perl
Poniżej znajduje się fragment perla, który umiera z dowolną liczbą komunikatów czasu kompilacji perla. Używa domowego pseudolosowego generatora liczb do generowania drukowalnych znaków ASCII, a następnie próbuje je wykonać jako perl. Nie znam dokładnej liczby ostrzeżeń czasowych kompilacji, które może dać perl, ale z pewnością jest co najmniej 30 takich błędów i mogą występować w różnych kombinacjach. Tak więc, chyba że zostanie uznany za nieprawidłowy, powiedziałbym, że ten kod otrzymuje rząd wielkości więcej punktów niż inne rozwiązania =)
Przykładowe dane wyjściowe z kilku różnych przebiegów (przeplatanych znakami nowej linii):
źródło
C # (85) (bez przerwania lub potwierdzenia)
To rozwiązanie wykorzystuje bieżący identyfikator procesu do określenia sposobu awarii.
Proces może zostać zakończony z powodu:
10x6 + 25 = 85
Edytować
Po tym, jak PO nie zezwoliło na Assert i Abort, usunąłem je z mojego rozwiązania, dlatego spada do 85 przy wszystkich prawidłowych dopuszczalnych metodach.
źródło
Abort()
iAssert()
. Sprawdź, czy nadal możesz zgłaszać te wyjątki, nie wywołując ich bezpośrednio.Process.GetCurrentProcess().Id / 4 % actions.Count
?Nie jestem pewien, czy to się kwalifikuje ...
do
Zarówno
i
element, jak i elementyp
są niezainicjowane, więc może to spowodować:i
<0i
jakoś osiągnie 0c
po wielokrotnych przyrostach stają się większe niżi
Ponadto może to zabić istniejącą aplikację (w zależności od wartości
p[c]
) za pomocą SIGSEGV.Pamiętaj, że nie testowałem tego ... więc skomentuj, jeśli to nie działa
źródło
Musujące .
Oświadczenie: podobne do cudownego rozwiązania Abhijita, ale:
głównym źródłem szaleństwa jest to, że zarządzany kod uzyskuje natywny szczegół implementacji poprzez kilka brzydkich hacków;
ten nie wymaga ASLR, tylko dynamiczny przydział pamięci.
Co to robi:
program wywołuje własnego interpretera (
spn
komendę) i przekazuje opis pustej tablicy do pliku. Tablica jest przydzielana dynamicznie, a opis zawiera jej adres pamięci.Następnie program otwiera plik, analizuje opis i uzyskuje adres jako liczbę całkowitą. Następnie wykonuje pewnego rodzaju haszowanie wartości wynikowej i wykonuje jedną z następujących błędnych akcji:
..
, a dodawanie ciągów jest wyjątkiem wykonawczym)nil
zgodne ze specyfikacją języka (ma to związek ze szczegółami implementacyjnymi - nie można go odróżnić od nieistniejącego globalnego). Po napotkaniu takiego symbolu generowany jest błąd czasu wykonywania.źródło
Kod Python - Walenie w komputer za pomocą nietoperza (w przenośni)
Jestem zbyt leniwy, aby to skończyć, ale ktoś, proszę, weź mój pomysł i biegnij z tym! Celem jest usunięcie jednego ważnego komponentu komputera i wykorzystywanie wyjątków dla tej części, aż w końcu po prostu uruchomisz wszystkie pliki / etc lub / usr / bin lub coś ważnego i obejrzysz, jak cała gra się psuje. Jestem pewien, że możesz zdobyć dużo „25 punktów”, gdy wszystko się zawiesi. :)
Skierowałem go na maszyny Linux. To oczywiście musi być uruchomione jako root dla maksymalnych obrażeń, a jeśli uruchomisz go wielokrotnie, spowoduje to, że twój system będzie całkowicie zepsuty!
Wyjątki:
bat.py:
źródło
TI-BASIC, 130
Do kalkulatora TI-84
Błędy krytyczne (w kolejności):
źródło
Kod PHP: 38 (+2) znaków, 5 błędów, nie do zdobycia
Lista możliwych błędów:
Błąd krytyczny: przekroczony maksymalny czas wykonania „n” sekund w linii 1
for(;;)
oznacza nieskończoną pętlęBłąd krytyczny: Dozwolony rozmiar pamięci 2097152 wyczerpanych bajtów (próbowano przydzielić 884737 bajtów) w linii 1
PHP ma
php.ini
plik, i jest tam wiersz z napisemmemory_limit=
i tutaj pojawia się maksymalne użycie RAM w bajtach.Część, która mówi,
$e.=$e++
oznacza, że$e
będzie wynikiem konkatenacji samego siebie powiększonej o 1 w każdej iteracji.Błąd krytyczny: nazwa klasy musi być poprawnym obiektem lub łańcuchem w wierszu 1
Klasy w PHP mogą być wywoływane albo przez nazwę klasy, albo przez zapisanie nazwy klasy jako łańcucha w var lub przez przypisanie nowej instancji klasy i wywołanie jej .
Przykład:
$b='PDO';$a=new $b();$a::connect();$b::connect()
-> to jest prawidłowy kod PHP.Ten błąd występuje, ponieważ
$e
występujenull
w pierwszej iteracjifor(;;)
pętli.Błąd krytyczny: nazwa funkcji musi być ciągiem w wierszu 1
Tak samo jak klasy, ale funkcje muszą być ciągiem (i
$e
jestnull
) lub nazwą funkcji bezpośrednio (przykłada()
:)Błąd krytyczny: nie można tworzyć odwołań do elementów wyrażenia tymczasowej tablicy w linii 1.
PHP ma
foreach
pętlę, która zapętla każdy element tablicy. Słowoas
kluczowe służy do wskazania nazwy nowej zmiennej używanej do przechowywania kopii wartości bieżącego indeksu tablicy.Podczas używania
foreach($array as &$v)
PHP tworzy referencję, gdy ma&
przed nazwą zmiennej.To słaby wynik (5 błędów i jest nie do zdobycia) = 50 punktów
PHP nie pozwala na łapanie krytycznych błędów.
W
shutdown -P +0
systemie Linux dodawanie między tylnymi palcami spowoduje uruchomienie tego polecenia (w tym przypadku spowoduje gwałtowne zamknięcie systemu).Powoduje to zatrzymanie wszystkich procesów.
Nie jestem pewien, czy dotyczy to premii, czy nie.
źródło
W języku ActionScript
Funkcje są wywoływane w niekończącej się pętli powodującej awarię interpretera.
źródło
insane
programu.