Comportement indéfini a tué mon chat
Il est bien connu qu'un comportement non défini peut tuer votre chat [citation nécessaire] .
Mais peut-il?
Ta tâche
- Ecrivez un programme qui appelle un comportement indéfini.
- Décrivez un scénario qui commence avec l'exécution du programme ci-dessus et qui aurait pour conséquence qu'un Felis catus mette fin à sa vie alors qu'il appartenait à vous, à la suite de l'UB susmentionné.
- Estimez la probabilité pour chaque étape du scénario.
- Calculez la probabilité totale qu'une seule exécution du programme tue votre chat.
Règles
- C'est un concours de popularité , soyez donc créatif si vous le pouvez.
- Il s’agit d’un défi lié à la programmation; la chaîne d’événements devrait donc se situer principalement dans l’ordinateur, et non dans le monde réel (bien sûr, si vous devez atteindre le monde réel si c’est là où se trouve votre chat).
- Si vous choisissez une langue qui n'a pas de comportement indéfini, utilisez quelque chose de similaire.
- Aucun animal ne peut être blessé dans la production de votre réponse.
Notation
Nombre de votes plus la probabilité totale du scénario (qui ne peut pas dépasser 1).
Exemple en C:
main(){printf();}
Scénario:
printf
appelé avec des ordures de la pile - comportement indéfini. Probabilité: 100%.- Le premier paramètre se trouve être la chaîne
Your cat is ugly!
. Probabilité: (1/256) 17 = (1.148 * 10 -37 )%. - Voyant le message, vous prenez votre arme et tirez votre chat. Probabilité: 3%.
- Le chat meurt. Probabilité: 93%.
Probabilité totale: (3.202 * 10 -39 )%.
popularity-contest
Ugoren
la source
la source
cat
commande ou quelque chose de ce genre.Réponses:
C
La plupart des réponses à cette question ont mal interprété la question en ce sens qu’elle tue le
cat
processus sur un système UNIX. Voici un programme qui peut provoquer la disparition d'une forme de vie biologique de l'espèce Felis Cattus, comme spécifié par la question.Cet exemple fonctionne sous Windows, mais il peut facilement être porté sur la plupart des systèmes d'exploitation UNIX en le remplaçant
iexplore -k
par la commande permettant de lancer un navigateur Web installé.Ce programme prétend conseiller l'utilisateur sur le régime alimentaire du chat.
Il démarrera Internet Explorer et dirigera l'utilisateur vers pets stackexchange en énumérant de nombreuses questions utiles sur la façon de nourrir les chats. Cependant, il y a peu de chances (1/256) que cela envoie l'utilisateur à la cuisson en échange de la pile, énumérant plutôt des astuces pour préparer des plats contenant du chocolat, qui est hautement toxique pour les chats . Pour aggraver les choses, il lancera Internet Explorer en mode kiosque (plein écran), ce qui masque la barre d’adresses et est difficile à échapper pour un utilisateur non averti en matière de technologie.
Cette ruse intelligente amènera l'utilisateur à nourrir son chat avec du chocolat, en pensant qu'il s'agit d'un régime alimentaire approprié, le forçant ainsi à le tuer par inadvertance.
la source
Frapper
Selon cela ,
INT_MIN % -1
mai ou ne pas être indéfini (quoi ???) , et pourrait donc causer des problèmes pour tout langage implémenté dans c / c ++.Le
cat
sera tué tôt si lebash
processus parent se bloque, ce qui peut arriver ou non.Sur ma VM, j'obtiens cette sortie:
(Je ne comprends pas vraiment la notation pour cette question, mais ici va quand même)
Calculer
$((2**63%-1))
. Le crash se produit toujours sur la version 4.2.25, mais semble ne tenir que sur certaines versions 3.x. Plus d'incertitude. Je pourrais vous dire la probabilité exacte, mais en raison du principe d’incertitude de Heisenburg, je tomberais alors dans un trou noir. Ou quelque chose. Je pense donc que nous pouvons sans risque affirmer que leur probabilité est d'environ 42%.la source
echo $((-2**63/-1)) | cat
cat
.INT_MAX = 2^63 - 1
. Si nous ajoutons 1 àINT_MAX
, l'espace numérique de 64 bits tourne autour et nous obtenonsINT_MIN
. En d' autres termes en arithmétique entier de 64 bits signé,2^63 == -2^63
. J'aurais pu utiliser-2**63
, mais préférais le caractère concis sans le-
, car l'arithmétique modulaire est la même dans ce cas.C (point de séquence)
deadcat.c:
Exécution (ou pas):
Scénario et probabilité
En supposant que 5% des utilisateurs de ce programme utilisent Clang pour compiler du code C (90% avec gcc et 5% avec d'autres compilateurs C):
Explication:
k = i + (++ i) accède et change "i" entre les points de la séquence. La probabilité n'est pas déterminable par le programme; cela dépend du choix du compilateur, qui est fait par l'utilisateur. "Indéfini" ne signifie pas nécessairement "aléatoire".
Voir https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points
la source
C
Histoire
Ma femme a hérité d'un chat de la famille. † Malheureusement, je suis très allergique aux animaux. Le chat avait bien dépassé son apogée et aurait dû être euthanasié avant même que nous l'ayons eu, mais elle ne pouvait se résoudre à s'en débarrasser à cause de sa valeur sentimentale. J'éclos un plan pour mettre fin à
mases souffrances.Nous allions en vacances prolongées, mais elle ne voulait pas monter à bord du chat chez le vétérinaire. Elle craignait de contracter une maladie ou d'être maltraité. J'ai créé un chargeur automatique de chat afin que nous puissions le laisser à la maison. J'ai écrit le micrologiciel du microcontrôleur en C. Le fichier contenant
main
ressemblait au code ci-dessous.Cependant, ma femme est également programmeuse et connaissait mes sentiments pour le chat. Elle a donc insisté sur une révision du code avant d'accepter de le laisser à la maison sans surveillance. Elle avait plusieurs préoccupations, notamment:
main
n'a pas de signature conforme aux normes (pour une implémentation hébergée)main
ne retourne pas de valeurtempTm
est utilisé non initialisé car amalloc
été appelé au lieu decalloc
malloc
ne doit pas être expriméeelapsedTime
variable peut ne pas avoir une plage suffisanteCela a pris beaucoup de conviction, mais elle a finalement convenu que ces thèses ne posaient pas de problèmes pour diverses raisons (cela ne faisait pas de mal que nous soyons déjà en retard pour notre vol). Comme il n'y avait pas de temps pour les tests en direct, elle a approuvé le code et nous sommes partis en vacances. Lorsque nous sommes revenus quelques semaines plus tard, la souffrance de
monchat était terminée (bien qu'en conséquence, j'en ai maintenant beaucoup plus).† Scénario entièrement fictif, pas de souci.
Code
Comportement non défini:
Pour ceux qui ne veulent pas chercher l’UB eux-mêmes:
Probabilité de tuer le chat:
J’estime que le chat meurt avec une probabilité de 0,995 .
la source
&
dans la mémoire, non?cat
.frapper
Version classique
A l'avantage de tuer tous les chats dans sa gamme.
Notez que le processus est immédiatement arrêté . Le seul moyen de le terminer par un seul appel de pkill est d’envoyer SIGKILL (9).
Donc:
p(SUCCESS) = p(RANDOM == 9) = 0.0275 %
Version quantique
Probabilité de tuer le chat pendant l'expérience: 50%
la source
cat &
tente de lire à partir du terminal, mais ne peut pas. Tous les signaux que vous avez mentionnés (et quelques autres) fonctionneront si vous envoyez ensuite SIGCONT (18). De plus, je conviens que raccrocher et mettre fin au chat équivaudrait à le tuer , mais l' interrompre ne semble pas satisfaisant ...: PC
Notez que cela ne fonctionne que sur linux.
Probabilité totale: 1x10 ^ -999999999999999999999999999999999999999999999999999999999, aprox.
la source
C ++
Votre chat est à la fois mort et vivant jusqu'à ce que vous soyez curieux. Ensuite, vous réalisez qu'il existe une probabilité de 0.5 que votre chat soit mort.
la source
this->m_dead
aprèsdelete this
?ö
ne semble pas être un symbole valide en C ++. Peut-être le remplacer paroe
.C
Fonctionne sous Linux.
Probabilité de tuer le chat: 1/256 (Le
sleep(1)
retourne 0, donc il sera tué six
vaut zéro.)En prime, il tue tous les chats actuellement en cours d'exécution sur votre système.
Si vous détestez autant les chats, je vous présente:
Le chat mille-pattes (Bash)
Étant donné que, dans The Human Centipede (Première séquence) , les trois chiens du chien centipede sont morts et que deux personnes sur trois du centipède humain sont morts, j'estime que la probabilité de tuer un chat est de 5/6.
la source
JavaScript
Exécution:
"Cat is fine"
"Cat is dead"
Explication:
Citant Glenn Randers-Pehrson, le programme ne permet pas de déterminer la probabilité; cela dépend du choix du navigateur, qui est fait par l'utilisateur.
la source
La lecture d'une valeur de fonction supposée renvoyer une valeur entraîne un comportement indéfini. Maintenant, il est évident, [citation nécessaire] que "chaque fois que vous atteignez un comportement indéfini, Dieu tue un chaton." En utilisant ceci nous concluons:
Peut être facilement rallongé par boucle pour exterminer tous les chats du monde.
la source
Java (ramassage des ordures)
Bien que le code puisse appeler System.gc (), cela ne garantit pas que le récupérateur de place collectera tous les objets inutilisés. Ainsi, pour le code suivant, il est imprévisible que le chat soit tué ou non.
La probabilité ne peut être calculée.
Notez qu'il y a toujours une chance que le chat soit "relancé" s'il y a un changement de contexte dans le thread GC après sysout et avant System.exit (0), mais j'ai préféré ne pas le couvrir pour garder le concept plus simple.
la source
System.out.close()
après laSystem.out.println("Cat is still alive.");
ligne.Quelqu'un a-t-il déjà pensé à tuer (a)
cat
?Probabilité de
cat
mourirPour la probabilité ... je suppose que nous devons distinguer certains cas:
cat
s est très faible, on peut supposer qu'il est nul. S'il a installé Cygwin, il comptera comme utilisateur Unix.cat
va échouer.cat
s avec une chance sur 1/6, mais il le répètera très probablement jusqu'à ce que quelque chose d'inattendu se produise. Sans perte de généralité, je suppose quecat
va certainement mourir.La probabilité globale dépend de la façon dont les utilisateurs sont mélangés et est difficile à déterminer. Mais on peut sûrement dire: Windows est un endroit sûr pour les chatons.
Test d'obéissance aux règles
Cela n'a pas tué d'animaux, la réponse est approuvée par l' American Humane Association .
prouve clairement qu’il
cat
n’ya pas d’animal (tantfile
que l’on ignore tout type d’héritage de type de fichier caché).la source
C
Si le nom de votre chat est trop long, il meurt.
gets
provoque la mort des chats, ainsi que d'autres problèmes.la source
Haskell
Ici, nous appliquons
unsafePerformIO
à une action qui a des effets secondaires observables . C’est toujours un comportement indéfini, du moins l’ordre des effets. Alors soit le programme tente-t-il d’abord d’essayer d’évaluerundefined
(celui-ci, ironiquement, n’est pas un comportement indéfini: il ne doit jamais donner une valeur qui permettrait au programme de continuer avec autre chose), ou il entraînera en fait le sérieux Effets secondaires. Dans ce cas, la chance de survie n’est que de 0,001% .Probabilité de tuer le chat donc: 49.9995%.
la source
Thue
Puisque la question autorise un langage qui n'a pas de comportement indéfini tant que l'effet est similaire, j'ai choisi Thue pour son non-déterminisme dans le choix de la règle à exécuter lorsqu'il y a plus d'une règle pouvant être appliquée à la règle actuelle. Etat.
Le programme sera introduit dans le contrôleur pour un four à micro-ondes dans lequel se trouve mon chat. La porte du four à micro-ondes est fermée et renforcée par une fermeture à glissière. La sortie du programme déterminera si le four à micro-ondes commence à micro-ondes ou non au chat.
La probabilité de tuer le chat dépend de la mise en œuvre de l'interprète, mais supposons qu'elle soit de 50%. La probabilité que le chat meure est alors de 0,5 .
la source
Math.random()
exemple, il ne s'agit pas d'un comportement non défini, mais simplement d'un comportement imprévisible.3. If you choose a language that doesn't have undefined behavior, use something similar.
Java
Selon la spécification
java.util.Date
aura un comportement indéfini. Alors tentez votre chance:la source