Undefiniertes Verhalten hat meine Katze getötet
Es ist bekannt , dass nicht definiertes Verhalten Ihre Katze töten [Bearbeiten] .
Aber kann es?
Deine Aufgabe
- Schreiben Sie ein Programm, das undefiniertes Verhalten aufruft.
- Beschreiben Sie ein Szenario, das mit der Ausführung des oben genannten Programms beginnt und dazu führt, dass eine Felis-Katze aufgrund der oben genannten UB ihr Leben in Ihrem Besitz beendet.
- Schätzen Sie die Wahrscheinlichkeit für jede Phase im Szenario.
- Berechnen Sie die Gesamtwahrscheinlichkeit, mit der ein einzelner Programmlauf Ihre Katze töten würde.
Regeln
- Dies ist ein Beliebtheitswettbewerb , also sei kreativ, wenn du kannst.
- Dies ist eine programmierbezogene Herausforderung, daher sollte sich die Ereigniskette hauptsächlich im Computer und nicht in der realen Welt befinden (natürlich, wenn Sie die reale Welt erreichen müssen, wenn sich Ihre Katze dort befindet).
- Wenn Sie eine Sprache auswählen, die kein undefiniertes Verhalten aufweist, verwenden Sie etwas Ähnliches.
- Bei der Erstellung Ihrer Antwort dürfen keine Tiere verletzt werden.
Wertung
Stimmenanzahl plus die Gesamtwahrscheinlichkeit des Szenarios (die 1 nicht überschreiten darf).
Beispiel in C:
main(){printf();}
Szenario:
printf
mit Müll aus dem Stapel aufgerufen - undefiniertes Verhalten. Wahrscheinlichkeit: 100%.- Der erste Parameter ist zufällig die Zeichenfolge
Your cat is ugly!
. Wahrscheinlichkeit: (1/256) 17 = (1,148 × 10 –37 )%. - Wenn Sie die Nachricht sehen, nehmen Sie Ihre Waffe und schießen auf Ihre Katze. Wahrscheinlichkeit: 3%.
- Die Katze stirbt. Wahrscheinlichkeit: 93%.
Gesamtwahrscheinlichkeit: (3.202 * 10 -39 )%.
popularity-contest
ugoren
quelle
quelle
cat
Befehl oder etwas Ähnliches zu töten .Antworten:
C
Die meisten Antworten auf diese Frage haben die Frage dahingehend falsch interpretiert, dass der
cat
Prozess auf einem UNIX-System abgebrochen wurde. Hier ist ein Programm, das den Tod einer biologischen Lebensform der Art Felis Cattus nach der Fragestellung verursachen kann.Dieses Beispiel wird unter Windows ausgeführt, kann jedoch problemlos auf die meisten UNIX-Betriebssysteme portiert werden, indem
iexplore -k
der Befehl zum Starten eines installierten Webbrowsers verwendet wird.Dieses Programm gibt vor, dem Benutzer Ratschläge zur Katzennahrung zu geben.
Der Internet Explorer wird gestartet und der Benutzer wird zum Austausch von Haustieren weitergeleitet. Dort werden viele hilfreiche Fragen zum Füttern von Katzen aufgelistet . Es besteht jedoch eine geringe Wahrscheinlichkeit (1/256), dass der Benutzer zum Stapelaustausch geschickt wird, statt Tipps zur Zubereitung von Schoko-Gerichten aufzulisten, die für Katzen hochgiftig sind . Erschwerend kommt hinzu, dass der Internet Explorer im Kiosk-Modus (Vollbildmodus) gestartet wird, der die Adressleiste verbirgt und für einen technisch nicht versierten Benutzer nur schwer zu umgehen ist.
Dieser clevere Trick wird den Benutzer dazu bringen, seine Katzenschokolade zu füttern, weil er glaubt, dass dies eine geeignete Diät ist, und sie veranlassen, sie versehentlich zu töten.
quelle
Bash
Nach diesem ,
INT_MIN % -1
kann oder auch nicht undefiniert sein (was ???) , und könnte so verursachen Probleme für jede in C / C ++ implementiert Sprache.Der
cat
wird vorzeitig beendet, wenn der übergeordnetebash
Prozess abstürzt, was passieren kann oder nicht.Auf meiner VM bekomme ich folgende Ausgabe:
(Ich verstehe die Wertung für diese Frage nicht wirklich, aber hier geht es trotzdem.)
Berechnen
$((2**63%-1))
. Absturz tritt immer bei Bash 4.2.25 auf, scheint aber bei einigen 3.x-Versionen nur zu hängen. Mehr Unsicherheit. Ich könnte Ihnen die genaue Wahrscheinlichkeit sagen, aber aufgrund des Heisenburgschen Unsicherheitsprinzips würde ich dann ein Schwarzes Loch stürzen. Oder so. Ich denke, wir können mit Sicherheit sagen, dass die Wahrscheinlichkeit bei ungefähr 42% liegt.quelle
echo $((-2**63/-1)) | cat
cat
.INT_MAX = 2^63 - 1
. Wenn wir 1 hinzufügen,INT_MAX
wird der 64-Bit-Nummernraum umbrochen und wir erhaltenINT_MIN
. Mit anderen Worten : in 64 - Bit - Integer - Arithmetik unterzeichnet2^63 == -2^63
. Ich hätte-2**63
die Kürze auch ohne die verwenden , aber vorziehen können-
, da die modulare Arithmetik in diesem Fall dieselbe ist.C (Sequenzpunkt)
deadcat.c:
Ausführung (oder nicht):
Szenario und Wahrscheinlichkeit
Angenommen, fünf Prozent der Benutzer, die dieses Programm ausführen, verwenden clang zum Kompilieren von C-Code (gegenüber 90 Prozent mit gcc und fünf Prozent mit anderen C-Compilern):
Erläuterung:
k = i + (++ i) greift auf "i" zwischen Sequenzpunkten zu und ändert es. Die Wahrscheinlichkeit ist vom Programm nicht bestimmbar; Dies hängt von der Auswahl des Compilers ab, der vom Benutzer vorgenommen wird. "Undefiniert" bedeutet nicht unbedingt "zufällig".
Siehe https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points
quelle
C
Hintergrundgeschichte
Meine Frau hat eine Katze von der Familie geerbt. † Ich bin leider sehr allergisch gegen Tiere. Die Katze war weit hinter ihrer Blüte und hätte eingeschläfert werden müssen, bevor wir sie bekamen, aber sie konnte sich aufgrund ihres sentimentalen Werts nicht dazu bringen, sie loszuwerden. Ich habe einen Plan entwickelt, um
meinLeiden zu beenden .Wir machten einen längeren Urlaub, aber sie wollte nicht in der Tierarztpraxis an Bord gehen. Sie war besorgt darüber, dass sie krank wurde oder misshandelt wurde. Ich habe eine automatische Katzenfütterung entwickelt, damit wir sie zu Hause lassen können. Ich habe die Firmware des Mikrocontrollers in C geschrieben. Die Datei
main
sah ähnlich aus wie der folgende Code.Meine Frau ist jedoch auch Programmiererin und kannte meine Gefühle gegenüber der Katze. Deshalb bestand sie auf einer Codeüberprüfung, bevor sie zustimmte, sie unbeaufsichtigt zu Hause zu lassen. Sie hatte mehrere Bedenken, darunter:
main
hat keine standardkonforme Signatur (für eine gehostete Implementierung)main
gibt keinen Wert zurücktempTm
wird nicht initialisiert verwendet, damalloc
statt aufgerufen wurdecalloc
malloc
sollte nicht umgewandelt werdenelapsedTime
Variable verfügt möglicherweise nicht über einen ausreichenden BereichEs hat viel Überzeugungsarbeit gekostet, aber sie stimmte schließlich zu, dass dies aus verschiedenen Gründen keine Probleme darstellte (es hat nicht geschadet, dass wir bereits zu spät zu unserem Flug kamen). Da keine Zeit für Live-Tests war, genehmigte sie den Code und wir fuhren in den Urlaub. Als wir ein paar Wochen später zurückkehrten, war das Elend
meinerKatze vorbei (obwohl ich jetzt viel mehr habe).† Völlig fiktives Szenario, keine Sorge.
Code
Undefiniertes Verhalten:
Für diejenigen, die sich nicht die Mühe machen wollen, die UB selbst zu finden:
Wahrscheinlichkeit, die Katze zu töten:
Ich schätze, dass die Katze mit einer Wahrscheinlichkeit von 0,995 stirbt .
quelle
&
in der memcpy, oder?cat
.Bash
Klassische Version
Hat den Vorteil, alle Katzen in seiner Reichweite zu töten .
Beachten Sie, dass der Prozess sofort gestoppt wird. Die einzige Möglichkeit, ihn mit einem einzigen Aufruf von pkill zu beenden, besteht darin, SIGKILL (9) zu senden.
Deshalb:
p(SUCCESS) = p(RANDOM == 9) = 0.0275 %
Quantenversion
Wahrscheinlichkeit, die Katze während des Versuchs zu töten: 50%
quelle
cat &
versucht, vom Terminal aus zu lesen, kann aber nicht. Alle von Ihnen erwähnten (und einige weitere) Signale funktionieren, wenn Sie anschließend SIGCONT (18) senden. Ich bin auch damit einverstanden, dass auflegen und beenden der Katze dasselbe wäre wie das Töten , aber es scheint nicht zufriedenstellend , sie zu unterbrechen ...: PC
Beachten Sie, dass dies nur unter Linux funktioniert.
Gesamtwahrscheinlichkeit: 1x10 ^ -99999999999999999999999999999999999999999999999999999999999, Ca.
quelle
C ++
Ihre Katze ist tot und lebendig, bis Sie neugierig sind. Dann stellen Sie fest, dass Ihre Katze mit einer Wahrscheinlichkeit von 0,5 tot ist.
quelle
this->m_dead
nachdelete this
?ö
scheint kein gültiges Symbol in C ++ zu sein. Vielleicht ersetzen Sie es durchoe
.C
Läuft unter Linux.
Wahrscheinlichkeit der Tötung der Katze: (Die 1/256
sleep(1)
0 zurück, so wird es , wenn getötet werdenx
. Null ist)Als Bonus werden alle Katzen getötet, die derzeit auf Ihrem System laufen.
Wenn Sie Katzen so sehr hassen, präsentiere ich Ihnen:
Der Katzenhundertfüßer (Bash)
Basierend auf der Tatsache, dass in The Human Centipede (First Sequence) alle drei Hunde des Hundezentipeders starben und zwei von drei Menschen des menschlichen Hundezentipeders starben, schätze ich, dass die Wahrscheinlichkeit, eine Katze zu töten, 5/6 beträgt.
quelle
JavaScript
Ausführung:
"Cat is fine"
"Cat is dead"
Erläuterung:
Mit Glenn Randers-Pehrson lässt sich die Wahrscheinlichkeit nicht durch das Programm bestimmen. Dies hängt von der Auswahl des Browsers ab, der vom Benutzer vorgenommen wird.
quelle
Das Lesen eines Funktionswerts, der einen Wert zurückgeben soll, führt zu undefiniertem Verhalten. Nun ist es offensichtlich, [Bearbeiten] , dass „Jedes Mal , wenn Sie nicht definiertes Verhalten erreichen, Gott ein Kätzchen tötet.“ Daraus schließen wir:
Kann einfach durch eine Schleife erweitert werden, um alle Katzen auf der Welt auszurotten.
quelle
Java (Speicherbereinigung)
Obwohl Code System.gc () aufrufen kann, wird nicht sichergestellt, dass der Garbage Collector alle nicht verwendeten Objekte sammelt. Daher ist es für den folgenden Code nicht vorhersehbar, ob die Katze getötet wird oder nicht.
Die Wahrscheinlichkeit kann nicht berechnet werden.
Beachten Sie, dass es immer noch eine Chance gibt, dass die Katze "wiederbelebt" wird, wenn im GC-Thread nach sysout und vor System.exit (0) ein Kontextwechsel stattfindet. Ich habe es jedoch vorgezogen, ihn nicht zu behandeln, um das Konzept zu vereinfachen.
quelle
System.out.close()
nach derSystem.out.println("Cat is still alive.");
Zeile hinzuzufügen .Hat jemand daran gedacht, wirklich (a) zu töten
cat
?Probabilitiy von
cat
SterbenFür die Wahrscheinlichkeit ... Ich denke, wir müssen einige Fälle unterscheiden:
cat
s ist sehr gering, kann mit Sicherheit als Null angenommen werden. Wenn er Cygwin installiert hat, zählt er als Unix-Benutzer.cat
schlägt fehl.cat
s mit einer Chance von 1/6 beendet, wird er ihn höchstwahrscheinlich wiederholen, bis etwas Unerwartetes eintritt. Ohne Verlust der Allgemeinheit gehe ich davon aus,cat
dass definitiv sterben wird.Die Gesamtwahrscheinlichkeit hängt davon ab, wie die Benutzer gemischt sind, und ist schwer zu bestimmen. Aber wir können mit Sicherheit sagen: Windows ist ein sicherer Ort für Kätzchen.
Prüfen, ob die Regeln eingehalten werden
Dies hat keine Tiere getötet, die Antwort wird von der American Humane Association genehmigt .
beweist eindeutig, dass
cat
es sich nicht um ein Tier handelt (solangefile
keine Art von Vererbung von versteckten Dateitypen bekannt ist).quelle
C
Wenn der Name Ihrer Katze zu lang ist, stirbt sie.
gets
verursacht Katzentod und andere Probleme.quelle
Haskell
Hier setzen wir
unsafePerformIO
auf eine Aktion , die beobachtbare Nebenwirkungen hat . Das ist immer undefiniertes Verhalten, zumindest die Reihenfolge der Effekte. Entweder stürzt das Programm beim Versuch einer Evaluierung zuerst abundefined
(ironischerweise handelt es sich nicht um ein undefiniertes Verhalten: Es darf niemals einen Wert ergeben, der es dem Programm ermöglicht, mit etwas anderem weiterzumachen), oder es wird tatsächlich die ernsthafte Internationale treffen Nebenwirkungen. In diesem Fall beträgt die Überlebenschance nur 0,001% .Wahrscheinlichkeit, die Katze zu töten: 49,9995%.
quelle
Thue
Da die Frage eine Sprache zulässt, die kein undefiniertes Verhalten aufweist, solange der Effekt ähnlich ist, wähle ich Thue aufgrund ihres Nichtdeterminismus bei der Auswahl der auszuführenden Regel, wenn mehr als eine Regel für die aktuelle Regel angewendet werden kann Zustand.
Das Programm wird in die Steuerung für einen Mikrowellenherd eingespeist, in dem sich meine Katze befindet. Die Tür zum Mikrowellenherd ist geschlossen und mit einem Kabelbinder verstärkt. Die Ausgabe des Programms entscheidet, ob der Mikrowellenherd die Katze zum Mikrowellenherd macht oder nicht.
Die Wahrscheinlichkeit, die Katze zu töten, hängt von der Implementierung des Dolmetschers ab. Nehmen wir an, es sind 50%. Dann beträgt die Wahrscheinlichkeit, dass die Katze stirbt, 0,5 .
quelle
Math.random()
Beispiel Dinge anzuhängen ist kein undefiniertes Verhalten, sondern nur unvorhersehbares Verhalten.3. If you choose a language that doesn't have undefined behavior, use something similar.
Java
Laut Spezifikation
java.util.Date
wird undefiniertes Verhalten haben. Also versuch dein Glück:quelle