El comportamiento indefinido mató a mi gato
Es bien sabido que un comportamiento indefinido puede matar a su gato [cita requerida] .
Pero puede?
Tu tarea
- Escriba un programa que invoque un comportamiento indefinido.
- Describa un escenario que comience con la ejecución del programa anterior, que resulte en un felis catus que termine su vida mientras sea de su propiedad, como resultado de la mencionada UB.
- Estime la probabilidad para cada etapa en el escenario.
- Calcule la probabilidad total de que una sola ejecución del programa mate a su gato.
Reglas
- Este es un concurso de popularidad , así que sé creativo si puedes.
- Este es un desafío relacionado con la programación, por lo que la cadena de eventos debe estar principalmente dentro de la computadora, no en el mundo real (por supuesto, si tiene que llegar al mundo real si es donde está su gato).
- Si elige un idioma que no tiene un comportamiento indefinido, use algo similar.
- Ningún animal puede ser dañado en la producción de su respuesta.
Puntuación
Recuento de votos más la probabilidad total del escenario (que no puede exceder 1).
Ejemplo en C:
main(){printf();}
Guión:
printf
llamado con basura de la pila - comportamiento indefinido. Probabilidad: 100%.- El primer parámetro pasa a ser la cadena
Your cat is ugly!
. Probabilidad: (1/256) 17 = (1.148 * 10 -37 )%. - Al ver el mensaje, tomas tu arma y le disparas a tu gato. Probabilidad: 3%.
- El gato muere. Probabilidad: 93%.
Probabilidad total: (3.202 * 10 -39 )%.
popularity-contest
Ugoren
fuente
fuente
cat
comando o algo por el estilo.Respuestas:
C
La mayoría de las respuestas a esta pregunta malinterpretaron la pregunta en el sentido de que estaba matando el
cat
proceso en un sistema UNIX. Aquí hay un programa que puede causar la desaparición de una forma de vida biológica de la especie Felis Cattus como se especifica en la pregunta.Este ejemplo se ejecuta en Windows, pero se puede portar fácilmente a la mayoría de los sistemas operativos UNIX al reemplazarlo
iexplore -k
con el comando para iniciar un navegador web instalado.Este programa pretende proporcionar consejos sobre la dieta del gato al usuario.
Iniciará Internet Explorer y dirigirá al usuario a la lista de intercambio de mascotas que incluye muchas preguntas útiles sobre cómo alimentar a los gatos. Sin embargo, existe una baja probabilidad (1/256) de que envíe al usuario a cocinar stackchange en lugar de enumerar consejos sobre cómo preparar platos que contienen chocolate, que es altamente tóxico para los gatos . Para empeorar las cosas, lanzará Internet Explorer en modo quiosco (pantalla completa), que oculta la barra de direcciones y es difícil de escapar para un usuario no experto en tecnología.
Esta artimaña inteligente convencerá al usuario de que alimente a su gato con chocolate creyendo que es una dieta adecuada para él, lo que hará que lo mate inadvertidamente.
fuente
Golpetazo
De acuerdo con esto ,
INT_MIN % -1
puede o no estar indefinido (¿qué ???) , por lo que puede causar problemas para cualquier lenguaje implementado en c / c ++.Se
cat
matará temprano si elbash
proceso padre falla, lo que puede suceder o no.En mi VM obtengo esta salida:
(Realmente no entiendo el puntaje de esta pregunta, pero aquí va de todos modos)
Calcular
$((2**63%-1))
. El bloqueo siempre ocurre en bash 4.2.25, pero parece que se cuelga en algunas versiones 3.x. Más incertidumbre Podría decirle la probabilidad exacta, pero debido al principio de incertidumbre de Heisenburg, caería en un agujero negro. O algo. Así que creo que podemos decir con seguridad que la probabilidad es aproximadamente del 42%.fuente
echo $((-2**63/-1)) | cat
cat
.INT_MAX = 2^63 - 1
. Si agregamos 1 aINT_MAX
, el espacio numérico de 64 bits se envuelve y obtenemosINT_MIN
. En otras palabras firmado aritmética entera de 64 bits,2^63 == -2^63
. Podría haber utilizado-2**63
, pero prefería la brevedad sin el-
, ya que la aritmética modular es la misma en este caso.C (punto de secuencia)
deadcat.c:
Ejecución (o no):
Escenario y probabilidad
Suponiendo que el cinco por ciento de las personas que ejecutan este programa usan clang para compilar código C (frente al 90 por ciento que usa gcc y el 5 por ciento que usa otros compiladores de C):
Explicación:
k = i + (++ i) accede y cambia "i" entre puntos de secuencia. La probabilidad no es determinable por el programa; depende de la elección del compilador, que realiza el usuario. "Indefinido" no significa necesariamente "aleatorio".
Ver https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points
fuente
C
Trasfondo
Mi esposa heredó un gato de la familia. † Desafortunadamente, soy muy alérgico a los animales. El gato ya había pasado su mejor momento y debería haber sido sacrificado incluso antes de que lo obtuviéramos, pero no pudo deshacerse de él debido a su valor sentimental. Elaboré un plan para poner fin a
misufrimiento.Nos íbamos de vacaciones, pero ella no quería subir al gato en la oficina del veterinario. Le preocupaba que contrajera enfermedades o fuera maltratada. Creé un alimentador automático de gatos para que pudiéramos dejarlo en casa. Escribí el firmware del microcontrolador en C. El archivo que contenía se
main
parecía al código siguiente.Sin embargo, mi esposa también es programadora y conocía mis sentimientos hacia el gato, por lo que insistió en una revisión del código antes de aceptar dejarlo en casa sin supervisión. Ella tenía varias preocupaciones, incluyendo:
main
no tiene una firma que cumpla con los estándares (para una implementación alojada)main
no devuelve un valortempTm
se usa sin inicializar ya quemalloc
se llamó en lugar decalloc
malloc
no se debe emitirelapsedTime
variable puede no tener suficiente rangoLe tomó mucho tiempo convencer, pero finalmente estuvo de acuerdo en que las tesis no eran problemas por varias razones (no estaba de más que ya llegáramos tarde a nuestro vuelo). Como no había tiempo para las pruebas en vivo, ella aprobó el código y nos fuimos de vacaciones. Cuando regresamos unas semanas más tarde,
mimiseria del gato había terminado (aunque como resultado ahora tengo mucho más).† Escenario completamente ficticio, no se preocupe.
Código
Comportamiento indefinido:
Para aquellos que no quieren molestarse en encontrar la UB ellos mismos:
Probabilidad de matar al gato:
Estimo que el gato muere con probabilidad 0.995 .
fuente
&
en la memoria, ¿verdad?cat
.golpetazo
Versión clásica
Tiene la ventaja de matar a todos los gatos en su rango.
Tenga en cuenta que el proceso se detiene de inmediato, por lo que la única forma de finalizarlo con una sola invocación de pkill es enviar SIGKILL (9).
Por lo tanto:
p(SUCCESS) = p(RANDOM == 9) = 0.0275 %
Versión cuántica
Probabilidad de matar al gato durante el experimento: 50%
fuente
cat &
intenta leer desde la terminal, pero no puede. Cualquiera de las señales que mencionó (y algunas más) funcionará si envía SIGCONT (18) después. Además, estoy de acuerdo en que colgar y terminar con el gato sería lo mismo que matarlo , pero interrumpirlo no parece satisfactorio ...: PC
Tenga en cuenta que esto solo funciona en Linux.
Probabilidad total: 1x10 ^ -999999999999999999999999999999999999999999999999999999999999999, aprox.
fuente
C ++
Tu gato está muerto y vivo hasta que tengas curiosidad. Entonces te das cuenta de que hay una probabilidad de 0.5 de que tu gato esté muerto.
fuente
this->m_dead
despuésdelete this
?ö
no parece ser un símbolo válido en C ++. Quizás reemplazarlo conoe
.C
Se ejecuta en Linux.
Probabilidad de matar al gato: 1/256 (
sleep(1)
devuelve 0, por lo que se matará six
es cero).Como beneficio adicional, mata a todos los gatos que se ejecutan actualmente en su sistema.
Si odias tanto a los gatos, te presento:
El ciempiés gato (Bash)
Basado en el hecho de que, en The Human Centipede (Primera secuencia) , murieron los tres perros del ciempiés, y dos de cada tres personas del ciempiés humano murieron, calculo que la probabilidad de matar a un gato es 5/6.
fuente
JavaScript
Ejecución:
"Cat is fine"
"Cat is dead"
Explicación:
Citando a Glenn Randers-Pehrson, la probabilidad no es determinable por el programa; depende de la elección del navegador, que realiza el usuario.
fuente
Leer un valor de función que se supone que devuelve un valor da como resultado un comportamiento indefinido. Ahora, es obvio, [cita requerida] que "Cada vez que alcanzas un comportamiento indefinido, Dios mata a un gatito". Usando esto concluimos:
Se puede extender fácilmente por bucle para exterminar a todos los gatos del mundo.
fuente
Java (recolección de basura)
Aunque el código puede invocar System.gc () no se asegura de que el recolector de basura recolecte todos los objetos no utilizados. Por lo tanto, para el siguiente código, es impredecible si el gato será asesinado o no.
La probabilidad no se puede calcular.
Tenga en cuenta que todavía existe la posibilidad de que el gato sea "revivido" si hay un cambio de contexto en el hilo del GC después de sysout y antes de System.exit (0) pero preferí no cubrirlo para mantener el concepto más simple.
fuente
System.out.close()
después de laSystem.out.println("Cat is still alive.");
línea.¿Alguien ha pensado en matar realmente (a)
cat
?Probabilidad de
cat
morirPara la probabilidad ... supongo que necesitamos distinguir algunos casos:
cat
s es muy baja, se puede suponer con seguridad que es cero. Si tiene instalado Cygwin, contará como usuario de Unix.cat
fallará.cat
s con una probabilidad de 1/6, lo más probable es que la repita hasta que ocurra algo inesperado. Sin pérdida de generalidad, supongocat
que definitivamente morirá.La probabilidad general depende de cómo se mezclan los usuarios y es difícil de determinar. Pero seguramente podemos decir: Windows es un lugar seguro para los gatitos.
Prueba de obediencia a las reglas
Esto no mató a los animales, la respuesta está aprobada por la American Humane Association .
demuestra claramente que
cat
no es un animal (siempre yfile
cuando no conozca ningún tipo de herencia de tipo de archivo oculto).fuente
C
Si el nombre de tu gato es demasiado largo, muere.
gets
causa muertes de gatos, junto con otros problemas.fuente
Haskell
Aquí, aplicamos
unsafePerformIO
a una acción que tiene efectos secundarios observables . Ese es siempre un comportamiento indefinido, al menos así es el orden de los efectos. Entonces, o el programa se bloqueará por primera vez al tratar de evaluarundefined
(irónicamente, ese no es un comportamiento indefinido: nunca debe arrojar un valor que permita que el programa continúe con otra cosa), o de hecho incurrirá en una seria internacional efectos secundarios. En ese caso, la probabilidad de supervivencia es de solo 0.001% .Probabilidad de matar al gato así: 49.9995%.
fuente
Jue
Dado que la pregunta permite un lenguaje que no tiene un comportamiento indefinido siempre que el efecto sea similar, elijo Thue por su no determinismo al elegir qué regla ejecutar cuando hay más de 1 regla que se puede aplicar en el actual estado.
El programa se alimentará al controlador para un horno de microondas, dentro del cual está mi gato. La puerta del horno de microondas está cerrada y reforzada por una cremallera. La salida del programa decidirá si el horno de microondas comienza a microondas o no al gato.
La probabilidad de matar al gato depende de la implementación del intérprete, pero digamos que es del 50%. Entonces la probabilidad de que el gato muera es 0.5 .
fuente
Math.random()
por ejemplo, no es un comportamiento indefinido, solo un comportamiento impredecible.3. If you choose a language that doesn't have undefined behavior, use something similar.
Java
Según las especificaciones
java.util.Date
tendrá un comportamiento indefinido. Así que prueba tu suerte:fuente