Nous savons tous comment la discussion sur le meilleur système d'exploitation a provoqué de nombreuses guerres de flammes. Votre objectif est maintenant de fournir une "preuve" décisive que votre système d'exploitation préféré est meilleur ... ah, non, beaucoup mieux, de fournir une "preuve" décisive qu'un autre système d'exploitation est mauvais.
La tâche: écrire un programme qui effectue certains calculs et qui fonctionne correctement sur au moins un système d'exploitation et incorrectement sur au moins un autre.
- le programme devrait faire au moins quelques calculs, donc il doit lire une entrée simple (de préférence sur l'entrée standard, ou si à partir de fichiers si vous le souhaitez, mais une mauvaise utilisation de petit endian / big endian serait non seulement bon marché, mais aussi évidente) , et fournir une sortie en fonction de l'entrée. Les calculs doivent être significatifs et justifiés, par exemple pour résoudre une vie réelle ou un problème mathématique.
- vous devez spécifier les deux systèmes d'exploitation, en indiquant sur lequel il fonctionnera correctement et sur lequel il ne fonctionnera pas. Les deux systèmes d'exploitation devraient être bien connus et à peu près au même moment (donc pas de DOS 1.0 par rapport à un système d'exploitation moderne). Il est conseillé de fournir une brève description de la cause de la différence (surtout si vous pensez que beaucoup de gens ne s'en rendraient pas compte) dans les balises de spoiler.
comme ça
la cause de la différence doit être subtile, donc non
#ifdef _WIN32
ou similaire, s'il vous plaît! N'oubliez pas que votre objectif est de «prouver» que ce système spécifique est mauvais, afin que les gens ne puissent pas (immédiatement) repérer votre astuce!s'il y a une partie très étrange ou très inhabituelle dans votre code, vous devez la justifier dans les commentaires pourquoi elle est là. Bien sûr, cette "justification" peut / sera un gros mensonge.
Notation:
Ce n'est pas un golf! Le code doit être bien organisé et simple. N'oubliez pas que votre objectif est d'y cacher un bug afin que les gens ne le soupçonnent pas. Plus le code est simple, moins il est suspect.
Le gagnant sera décidé par vote. Le plus grand nombre de votes environ 10 jours après la première soumission valide gagne. Généralement, les réponses où le code est facile à lire et à comprendre, mais le bogue est bien caché, et même s'il est découvert, peut être attribué à une erreur plutôt qu'à de la malveillance, doit être votée. De même, cela devrait valoir beaucoup plus si le bogue provoque juste un résultat incorrect, plutôt que de simplement provoquer le plantage du programme ou de ne rien faire.
Comme d'habitude, je me réserve le droit de choisir une réponse en tant que gagnante si elle n'est pas plus de 10% ou 1 point en dessous de celle avec le plus de votes, sur n'importe quel critère subjectif.
make (1)
fonctionne correctement sur pratiquement toutes les boîtes Unix et incorrectement certaines boîtes Windows. Pas à cause des OS, mais à cause des systèmes de fichiers. Tout système de fichiers qui conserve les dates de modification des fichiers avec une faible précision peut échouermake
correctement sur une machine rapide.Réponses:
Shell Unix + utilitaires standard
Écrivons un script shell qui trouve le processus (appartenant à n'importe quel utilisateur) qui a utilisé le plus de temps CPU, et tue tous les processus avec le même nom. Je suppose que cela compte comme lire des données (du système) et effectuer un calcul. (Ce comportement pourrait être utile pour les processus qui engendrent de nombreux processus, tels que les bombes à fourche et Google Chromium.)
Ce qui suit devrait être un moyen portable pour obtenir le nom du processus avec le plus grand temps CPU (j'ai essayé d'éviter les Linuxismes évidents mais je ne l'ai pas testé sur Solaris):
Donc, notre script est tout simplement
Exécutez en tant que root pour de meilleurs résultats, afin qu'il puisse tuer les processus des autres utilisateurs.
Linux et BSD
Cela fonctionne sur Linux et devrait fonctionner sur les BSD, car
killall arg
tue les processus nommésarg
.Solaris
Cependant, sous Solaris, si un utilisateur exécute un programme nommé
9
dans une boucle infinie, le script fera tomber le système . Ceci est dû au fait:NB
la source
killall
n'est pas un exemple. C'est juste deux programmes différents avec le même nom. Chaque version fonctionne correctement.Python
Ce programme ouvre l'image spécifiée sur la ligne de commande et l'affiche.
Fonctionne sur Linux, ne fonctionne pas sur Windows.
Cela est dû à la façon dont Windows ouvre les fichiers. Le mode binaire doit être spécifié pour que cela fonctionne correctement sur tous les systèmes d'exploitation.
la source
Little Endian (Intel x86) vs Big Endian (IBM Power7)
Tout format de fichier comportant des quantités binaires multi-octets dans un ordre non hôte risque d'être mal interprété. Voici une fonction qui prend l'audio brut, disons extrait d'un fichier WAV (qui est un petit format de fichier Microsoft endian), divise par deux l'amplitude et produit l'audio atténué.
Dans les petites machines endiennes, cela fonctionne très bien, mais dans les grandes machines endiennes, c'est un désastre. Par exemple
Déplacer à droite sur le petit endian:
Déplacez à droite sur big endian:
Notez que certains nybbles sont corrects! En fait, c'est une chance de 50:50 que la sortie soit correcte, selon que le bit le moins significatif de l'échantillon sonore est 0 ou 1!
Donc, lorsque vous écoutez cet audio, c'est comme une demi-amplitude mais avec un peu de bruit aigu et aigu superposé. Assez surprenant si vous n'y êtes pas préparé!
la source
GTB
Sur l'ordinateur, cela fonctionne, mais pas sur ma calculatrice TI-84. Pourquoi?
la source
C
Cette solution au problème 100 (concernant la séquence Collatz) est acceptée par UVa Online Judge.
Cependant, ce code ne fonctionne correctement que sur la plate-forme * nix car le
long
type est implémenté en tant qu'entier signé 64 bits. Sous Windows , le code invoque un comportement indéfini, car lelong
type est implémenté en tant qu'entier signé 32 bits, tandis que l'une des valeurs intermédiaires de lacyc()
fonction nécessite au moins 32 bits pour représenter.Une autre façon de rendre cela encore plus incompatible est de mettre le tableau à l'
l
intérieurmain()
et d'apporter les modifications correspondantes à lacyc()
fonction. Étant donné que l'exécutable est configuré pour demander une pile de 2 Mo par défaut sous Windows, le programme se bloque immédiatement.la source
Python
Je suis tombé sur cela sur StackOverflow lors de la recherche de délais d'attente d'entrée.
Cela ne fonctionne pas pour Windows.
la source
conio.h
aurait le même effet, mais C ne compilera même pas.Linux + bash + GNU coreutils
Cela effacera le dossier racine et tout ce qui n'existe pas dans Windows, même si vous installez bash pour Windows :)
la source
cmd.exe
et à taperrm
pour voir que cela ne fonctionne pas.