Todos sabemos cómo la discusión sobre cuál es el mejor sistema operativo causó muchas guerras de llamas. Su objetivo ahora es proporcionar una "prueba" decisiva de que su sistema operativo favorito es mejor ... ah, no, mucho mejor, proporcionar una "prueba" decisiva de que otro sistema operativo es malo.
La tarea: escribir un programa, que haga algunos cálculos, y funcione correctamente en al menos un sistema operativo e incorrectamente en al menos otro.
- el programa debe hacer al menos algunos cálculos, por lo que tiene que leer alguna entrada simple (preferiblemente en la entrada estándar, o si es de archivos si lo desea, pero el mal uso de little endian / big endian no solo sería barato, sino también obvio) , y proporcionar algo de salida dependiendo de la entrada. Los cálculos deben ser significativos y justificados, por ejemplo, resolver una vida real o un problema matemático.
- debe especificar ambos sistemas operativos, indicando en cuál funcionará correctamente y en cuál no. Ambos sistemas operativos deben ser bien conocidos, y aproximadamente desde el mismo tiempo (por lo que no hay DOS 1.0 versus un SO moderno). Se recomienda proporcionar una breve descripción sobre la causa de la diferencia (especialmente si sospecha que muchas personas no se darían cuenta) en las etiquetas de spoiler.
Me gusta esto
La causa de la diferencia tiene que ser sutil, así que no
#ifdef _WIN32
o similar, ¡por favor! Recuerde, su objetivo es "probar" que este sistema específico es malo, por lo que las personas no deberían ser capaces (inmediatamente) de detectar su truco.Si hay una parte muy extraña o muy inusual en su código, debe justificarlo en los comentarios por qué está allí. Por supuesto, esta "justificación" puede / será una gran mentira.
Tanteo:
¡Esto no es un golf! El código debe estar bien organizado y ser simple. Recuerde, su objetivo es ocultar un error para que la gente no sospeche de ello. Cuanto más simple es el código, menos sospechoso es.
El ganador se decidirá por votos. La mayoría de los votos después de aproximadamente 10 días después de la primera presentación válida gana. En general, las respuestas donde el código es fácil de leer y comprender, pero el error está bien oculto, e incluso si se descubre, se puede atribuir a un error en lugar de a la malicia, se debe votar. Del mismo modo, debería valer mucho más si el error solo causa un resultado incorrecto, en lugar de causar que el programa se bloquee o no haga nada.
Como de costumbre, me retengo el derecho de elegir una respuesta como ganador si no está más del 10% o 1 punto por debajo de la que tiene más votos, en cualquier criterio subjetivo.
make (1)
funciona correctamente en prácticamente todos los cuadros de Unix y de forma incorrecta en algunos cuadros de Windows. No por los sistemas operativos, sino por los sistemas de archivos. Cualquier sistema de archivos que mantenga las fechas de modificación de archivos con baja precisión puede fallarmake
correctamente en una máquina rápida.Respuestas:
Unix shell + utilidades estándar
Escribamos un script de shell que encuentre el proceso (propiedad de cualquier usuario) que haya utilizado más tiempo de CPU y elimine todos los procesos con el mismo nombre. Supongo que eso cuenta como leer datos (del sistema) y realizar un cálculo. (Ese comportamiento podría ser útil para procesos que desequilibran muchos procesos, como las bombas de horquilla y Google Chromium).
La siguiente debería ser una forma portátil de obtener el nombre del proceso con el mayor tiempo de CPU (intenté evitar Linuxismos obvios pero no lo he probado en Solaris):
Entonces nuestro guión es simplemente
Ejecútelo como root para obtener mejores resultados, de modo que pueda eliminar procesos de otros usuarios.
Linux y BSD
Esto funciona en Linux y debería funcionar en los BSD, porque
killall arg
mata los procesos nombradosarg
.Solaris
Sin embargo, en Solaris, si un usuario ejecuta un programa denominado
9
en un bucle infinito, el script desactivará el sistema . Esto es porque:nótese bien
fuente
killall
No es un ejemplo. Que solo dos programas diferentes con el mismo nombre. Cada versión funciona correctamente.Pitón
Este programa abre la imagen especificada en la línea de comando y la muestra.
Funciona en Linux, no funciona en Windows.
Esto se debe a la forma en que Windows abre los archivos. Se debe especificar el modo binario para que funcione correctamente en todos los sistemas operativos.
fuente
Little Endian (Intel x86) frente a Big Endian (IBM Power7)
Cualquier formato de archivo donde haya cantidades binarias de varios bytes en un orden que no sea de host corre el riesgo de ser malinterpretado. Aquí hay una función que toma audio sin formato, por ejemplo, extraído de un archivo WAV (que es un formato de archivo pequeño endian de Microsoft), reduce a la mitad la amplitud y genera el audio atenuado.
En máquinas endian pequeñas, esto funciona muy bien, pero en máquinas endian grandes, es un desastre. P.ej
Desplazar a la derecha en little endian:
Desplazar a la derecha en Big Endian:
¡Tenga en cuenta que algunas de las nybbles son correctas! De hecho, es una posibilidad 50:50 de que la salida sea correcta, ¡dependiendo de si el bit menos significativo de la muestra de sonido es 0 o 1!
Entonces, cuando escuchas este audio, es como la mitad de la amplitud, pero con un poco de ruido agudo y agudo superpuesto. ¡Bastante sorprendente si no estás preparado para ello!
fuente
GTB
En la computadora funciona, pero en mi calculadora TI-84 no. ¿Por qué?
fuente
do
Esta solución al problema 100 (sobre la secuencia de Collatz) es aceptada por el juez en línea de UVa.
Sin embargo, este código solo funciona correctamente en la plataforma * nix ya que el
long
tipo se implementa como un entero con signo de 64 bits. En Windows , el código invoca un comportamiento indefinido, ya que ellong
tipo se implementa como un entero con signo de 32 bits, mientras que uno de los valores intermedios en lacyc()
función necesita al menos 32 bits para representarlo.Otra forma de hacer que esto sea aún más incompatible es colocar la matriz
l
dentromain()
y hacer los cambios correspondientes paracyc()
funcionar. Como el ejecutable está configurado para solicitar una pila de 2 MB de forma predeterminada en Windows, el programa se bloquea de inmediato.fuente
Pitón
Encontré esto en StackOverflow cuando buscaba tiempos de espera de entrada.
Esto no funciona para Windows.
fuente
conio.h
tendría el mismo efecto, pero C ni siquiera compilará.Linux + bash + GNU coreutils
Esto borrará la carpeta raíz y todo lo que no existe en Windows, incluso si instala bash para Windows :)
fuente
cmd.exe
y escribirrm
para ver que no funciona.