Undefined Behavior Killed My Cat
Powszechnie wiadomo, że niezdefiniowane zachowanie może zabić twojego kota [potrzebne źródło] .
Ale czy to możliwe?
Twoje zadanie
- Napisz program, który wywołuje niezdefiniowane zachowanie.
- Opisz scenariusz, który rozpoczyna się od uruchomienia powyższego programu, w wyniku czego catis Felis kończy życie, gdy jesteś właścicielem, w wyniku wyżej wspomnianego UB.
- Oszacuj prawdopodobieństwo dla każdego etapu w scenariuszu.
- Oblicz całkowite prawdopodobieństwo, że jedno uruchomienie programu zabije twojego kota.
Zasady
- To konkurs popularności , więc bądź kreatywny, jeśli możesz.
- Jest to wyzwanie związane z programowaniem, więc łańcuch wydarzeń powinien znajdować się głównie w komputerze, a nie w realnym świecie (oczywiście, jeśli musi dotrzeć do realnego świata, jeśli tam jest twój kot).
- Jeśli wybierzesz język, który nie ma niezdefiniowanego zachowania, użyj czegoś podobnego.
- Żadne zwierzęta nie mogą zostać skrzywdzone przy tworzeniu twojej odpowiedzi.
Punktacja
Liczba głosów plus całkowite prawdopodobieństwo scenariusza (które nie może przekroczyć 1).
Przykład w C:
main(){printf();}
Scenariusz:
printf
wywoływane ze śmieciami ze stosu - niezdefiniowane zachowanie. Prawdopodobieństwo: 100%.- Pierwszym parametrem jest łańcuch
Your cat is ugly!
. Prawdopodobieństwo: (1/256) 17 = (1,148 * 10-37 )%. - Widząc wiadomość, podnosisz broń i zabijasz kota. Prawdopodobieństwo: 3%.
- Kot umiera. Prawdopodobieństwo: 93%.
Całkowite prawdopodobieństwo: (3,202 * 10 -39 )%.
popularity-contest
ugoren
źródło
źródło
cat
polecenie lub coś w tym rodzaju.Odpowiedzi:
do
Większość odpowiedzi na to pytanie błędnie zinterpretowała pytanie, ponieważ zabijało
cat
proces w systemie UNIX. Oto program, który może spowodować upadek biologicznej formy życia gatunku Felis Cattus, jak określono w pytaniu.Ten przykład działa w systemie Windows, ale można go łatwo przenieść do większości systemów operacyjnych UNIX, zastępując
iexplore -k
polecenie uruchomienia zainstalowanej przeglądarki internetowej.Ten program udaje, że udziela porad dotyczących diety kotów.
Uruchomi Internet Explorera i przekieruje użytkownika do stosu zwierząt domowych, wymieniając wiele przydatnych pytań na temat karmienia kotów. Istnieje jednak niska (1/256) szansa, że wyśle użytkownika do gotowania stosu wymiany zamiast listy wskazówek, jak przygotować dania zawierające czekoladę, która jest bardzo toksyczna dla kotów . Co gorsza, uruchomi przeglądarkę internetową w trybie kiosku (pełny ekran), który ukrywa pasek adresu i jest trudny do uniknięcia dla użytkownika nie znającego się na technologii.
Ten sprytny podstęp zmusi użytkownika do karmienia swojej kota czekoladą, wierząc, że jest to odpowiednia dieta, a tym samym niechcący ją zabije.
źródło
Grzmotnąć
Zgodnie z tym ,
INT_MIN % -1
może, ale nie musi być niezdefiniowany (co ???) , a zatem może powodować problemy dla dowolnego języka zaimplementowanego w c / c ++.cat
Zostanie zabity wcześnie, jeśli rodzicbash
proces ulega awarii, która może lub nie może się zdarzyć.Na mojej maszynie wirtualnej otrzymuję ten wynik:
(Naprawdę nie rozumiem punktacji dla tego pytania, ale i tak tu idzie)
Oblicz
$((2**63%-1))
. Awaria zawsze zdarza się w wersji bash 4.2.25, ale wydaje się, że zawiesiła się na niektórych wersjach 3.x. Więcej niepewności. Mógłbym powiedzieć dokładne prawdopodobieństwo, ale z powodu zasady nieoznaczoności Heisenburga upadłbym wtedy do czarnej dziury. Lub coś. Myślę więc, że możemy spokojnie powiedzieć, że prawdopodobieństwo wynosi około 42%.źródło
echo $((-2**63/-1)) | cat
cat
.INT_MAX = 2^63 - 1
. Jeśli dodamy 1 doINT_MAX
, przestrzeń liczbowa 64-bitowa zawija się i otrzymujemyINT_MIN
. Innymi słowy w podpisanym 64-bitowej liczby całkowitej arytmetyki2^63 == -2^63
. Mógłbym użyć-2**63
, ale wolałem zwięzłość bez-
, ponieważ arytmetyka modułowa jest w tym przypadku taka sama.C (punkt sekwencji)
deadcat.c:
Wykonanie (lub nie):
Scenariusz i prawdopodobieństwo
Zakładając, że pięć procent osób korzystających z tego programu używa clang do kompilacji kodu C (w porównaniu do 90 procent przy użyciu gcc i 5 procent przy użyciu innych kompilatorów C):
Wyjaśnienie:
k = i + (++ i) uzyskuje dostęp i zmienia „i” między punktami sekwencji. Prawdopodobieństwo nie jest określane przez program; zależy to od wyboru kompilatora dokonanego przez użytkownika. „Niezdefiniowany” niekoniecznie oznacza „losowy”.
Zobacz https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points
źródło
do
Historia
Moja żona odziedziczyła kota od rodziny. † Niestety jestem bardzo uczulony na zwierzęta. Kot był już daleko od swojej świetności i powinien był zostać uśmiercony, zanim jeszcze go dostaliśmy, ale nie mogła się zmusić do pozbycia się go ze względu na jego sentymentalną wartość. I wykluły plan, aby zakończyć
mójJego cierpienia.Jechaliśmy na dłuższy urlop, ale ona nie chciała wejść na pokład kota w gabinecie weterynarza. Martwiła się tym, że zapada na nią choroba lub jest źle traktowana. Stworzyłem automatyczny karmnik dla kotów, abyśmy mogli zostawić go w domu. Napisałem oprogramowanie mikrokontrolera w C. Zawierający plik
main
wyglądał podobnie do poniższego kodu.Jednak moja żona jest również programistą i znała moje uczucia do kota, dlatego nalegała na weryfikację kodu, zanim zgodziła się zostawić go w domu bez opieki. Miała kilka obaw, w tym:
main
nie ma podpisu zgodnego ze standardami (dla hostowanej implementacji)main
nie zwraca wartościtempTm
jest używany niezainicjowany, ponieważmalloc
został wywołany zamiastcalloc
malloc
nie powinna być rzutowanaelapsedTime
zmienna może nie mieć wystarczającego zakresuPotrzeba było wielu przekonujących, ale w końcu zgodziła się, że tezy nie były problemami z różnych powodów (nie bolało, że spóźniliśmy się już na nasz lot). Ponieważ nie było czasu na testy na żywo, zatwierdziła kod i pojechaliśmy na wakacje. Kiedy wróciliśmy kilka tygodni później,
mojanędzamojegokota się skończyła (chociaż w rezultacie mam teraz dużo więcej).† Całkowicie fikcyjny scenariusz, bez obaw.
Kod
Niezdefiniowane zachowanie:
Dla tych, którzy nie chcą zawracać sobie głowy znalezieniem samego UB:
Prawdopodobieństwo zabicia kota:
Szacuję, że kot umiera z prawdopodobieństwem 0,995 .
źródło
&
w memcpy, prawda?cat
.grzmotnąć
Wersja klasyczna
Ma tę zaletę, że zabija wszystkie koty w swoim zasięgu.
Zauważ, że proces zostaje natychmiast zatrzymany , więc jedynym sposobem na zakończenie go pojedynczym wywołaniem pkill jest wysłanie SIGKILL (9).
W związku z tym:
p(SUCCESS) = p(RANDOM == 9) = 0.0275 %
Wersja kwantowa
Prawdopodobieństwo zabicia kota podczas eksperymentu: 50%
źródło
cat &
próbuje czytać z terminala, ale nie może. Każdy z wymienionych przez ciebie sygnałów (i kilka innych) zadziała, jeśli później wyślesz SIGCONT (18). Również zgadzam się, że wisi i kończące kota będzie taka sama jak zabija go, ale przerywania nie wydaje się zadowalająca ...: Pdo
Zauważ, że działa to tylko w systemie Linux.
Całkowite prawdopodobieństwo: 1x10 ^ -999999999999999999999999999999999999999999999999999999999999999, ok.
źródło
C ++
Twój kot jest martwy i żywy, dopóki nie będziesz ciekawy. Wtedy zdajesz sobie sprawę, że istnieje 0,5 prawdopodobieństwa, że Twój Kot nie żyje.
źródło
this->m_dead
podelete this
?ö
nie wydaje się być poprawnym symbolem w C ++. Może zastąp tooe
.do
Działa w systemie Linux.
Prawdopodobieństwo zabicia kota: 1/256 (
sleep(1)
Zwraca 0, więc zostanie zabity, jeślix
wynosi zero).Jako bonus, zabija wszystkie koty aktualnie uruchomione w twoim systemie.
Jeśli tak bardzo nienawidzisz kotów, przedstawiam ci:
Stonoga kota (Bash)
Opierając się na fakcie, że w Ludzkiej stonodze (pierwsza sekwencja) wszystkie trzy psy stonogi psiej zmarły, a dwie z trzech osób ludzkiej stonogi umarły, szacuję, że prawdopodobieństwo zabicia jednego kota wynosi 5/6.
źródło
JavaScript
Wykonanie:
"Cat is fine"
"Cat is dead"
Wyjaśnienie:
Cytując Glenna Randersa-Pehrsona, program nie określa prawdopodobieństwa; zależy to od wyboru przeglądarki dokonanej przez użytkownika.
źródło
Odczyt wartości funkcji, która ma zwrócić wartość, powoduje niezdefiniowane zachowanie. Teraz jest oczywiste [potrzebne źródło], że „za każdym razem, gdy osiągasz niezdefiniowane zachowanie, Bóg zabija kotka”. Korzystając z tego, dochodzimy do:
Można go łatwo rozszerzyć za pomocą pętli, aby eksterminować wszystkie koty na świecie.
źródło
Java (odśmiecanie)
Chociaż kod może wywoływać System.gc (), nie zapewnia, że Garbage Collector zbierze wszystkie nieużywane obiekty. Dlatego w przypadku poniższego kodu nieprzewidywalne jest, czy kot zostanie zabity, czy nie.
Prawdopodobieństwa nie można obliczyć.
Zauważ, że wciąż istnieje szansa, że kot zostanie „wskrzeszony”, jeśli w sysout i przed System.exit (0) istnieje przełącznik kontekstu w wątku GC, ale wolałem nie zakrywać go, aby uprościć koncepcję.
źródło
System.out.close()
poSystem.out.println("Cat is still alive.");
linii.Czy ktoś pomyślał o zabiciu (a)
cat
?Prawdopodobieństwo
cat
śmierciDla prawdopodobieństwa ... Myślę, że musimy rozróżnić niektóre przypadki:
cat
jest bardzo niska, można bezpiecznie założyć, że wynosi zero. Jeśli ma zainstalowany Cygwin, będzie się liczyć jako użytkownik unix.cat
nie powiedzie się.cat
s tylko z szansą 1/6, najprawdopodobniej powtórzy je, dopóki nie wydarzy się coś nieoczekiwanego. Zakładam, że bez utraty ogólności nacat
pewno umrze.Ogólne prawdopodobieństwo zależy od sposobu mieszania użytkowników i jest trudne do ustalenia. Ale z pewnością możemy powiedzieć: Windows to bezpieczne miejsce dla kociąt.
Testowanie posłuszeństwa zasad
To nie zabijało zwierząt, odpowiedź jest zatwierdzona przez American Humane Association .
wyraźnie dowodzi, że
cat
nie jest to zwierzę (o ilefile
nie zna żadnego dziedziczenia typu ukrytego pliku).źródło
do
Jeśli imię twojego kota jest za długie, umiera.
gets
powoduje śmierć kota i inne problemy.źródło
Haskell
Tutaj stosujemy się
unsafePerformIO
do działania, które ma obserwowalne skutki uboczne . Jest to zawsze niezdefiniowane zachowanie, a przynajmniej kolejność efektów. Więc albo program po raz pierwszy zawiesi się przy próbie ocenyundefined
(to, jak na ironię, nie jest niezdefiniowanym zachowaniem: nigdy nie może dać wartości, która pozwoliłaby programowi na kontynuowanie czegoś innego), lub w rzeczywistości poniesie poważną międzynarodową skutki uboczne. W takim przypadku szansa na przeżycie wynosi tylko 0,001% .Prawdopodobieństwo zabicia kota w ten sposób: 49,9995%.
źródło
Czw
Ponieważ pytanie dopuszcza język, który nie ma nieokreślonego zachowania, dopóki efekt jest podobny, wybrałem Thue ze względu na jego niedeterminizm w wyborze, która reguła ma zostać wykonana, gdy istnieje więcej niż 1 reguła, którą można zastosować do bieżącego stan.
Program zostanie podany do sterownika kuchenki mikrofalowej, w której znajduje się mój kot. Drzwi do kuchenki mikrofalowej są zamknięte i wzmocnione suwakiem. Wynik programu zadecyduje, czy kuchenka mikrofalowa zacznie mikrofalować kota, czy nie.
Prawdopodobieństwo zabicia kota zależy od implementacji interpretera, ale powiedzmy, że jest to 50%. Zatem prawdopodobieństwo śmierci kota wynosi 0,5 .
źródło
Math.random()
przykład uzależnianie się od rzeczy nie jest zachowaniem nieokreślonym, tylko zachowaniem nieprzewidywalnym.3. If you choose a language that doesn't have undefined behavior, use something similar.
Jawa
Według specyfikacji
java.util.Date
zachowanie będzie niezdefiniowane. Spróbuj szczęścia:źródło