Wir alle wissen, wie die Diskussion um das beste Betriebssystem viele Flammenkriege ausgelöst hat. Ihr Ziel ist es nun, den entscheidenden "Beweis" zu erbringen, dass Ihr Lieblingsbetriebssystem besser ist ... ah, nein, viel besser, den entscheidenden "Beweis" zu erbringen, dass ein anderes Betriebssystem schlecht ist.
Die Aufgabe: Schreiben Sie ein Programm, das einige Berechnungen durchführt und auf mindestens einem Betriebssystem korrekt und auf mindestens einem anderen falsch funktioniert.
- Das Programm sollte zumindest einige Berechnungen durchführen, daher muss es einige einfache Eingaben lesen (vorzugsweise auf der Standardeingabe, oder wenn aus Dateien, wenn Sie möchten, aber der Missbrauch von Little Endian / Big Endian wäre nicht nur billig, sondern auch offensichtlich) . und bieten einige Ausgabe abhängig von der Eingabe. Die Berechnungen sollten aussagekräftig und gerechtfertigt sein, beispielsweise um ein reales Leben oder ein mathematisches Problem zu lösen.
- Sie sollten beide Betriebssysteme angeben und angeben, auf welchem es ordnungsgemäß funktioniert und auf welchem nicht. Beide Betriebssysteme sollten wohlbekannt sein und ungefähr zur gleichen Zeit (also kein DOS 1.0 im Vergleich zu einem modernen Betriebssystem). Es wird empfohlen, in Spoiler-Tags eine kurze Beschreibung der Ursache des Unterschieds anzugeben (insbesondere, wenn Sie den Verdacht haben, dass viele Leute dies nicht bemerken würden).
so was
die ursache für den unterschied muss subtil sein, also nein
#ifdef _WIN32
oder ähnlich, bitte! Denken Sie daran, Ihr Ziel ist es, zu "beweisen", dass dieses spezielle System schlecht ist, sodass die Leute Ihren Trick nicht (sofort) erkennen sollten!Wenn Ihr Code einen sehr seltsamen oder sehr ungewöhnlichen Teil enthält, müssen Sie ihn in Kommentaren begründen, warum er vorhanden ist. Natürlich kann / wird diese "Rechtfertigung" eine große Lüge sein.
Wertung:
Das ist kein Golf! Der Code sollte gut organisiert und einfach gehalten sein. Denken Sie daran, Ihr Ziel ist es, einen Fehler darin zu verstecken, damit die Leute ihn nicht ahnen. Je einfacher der Code, desto weniger verdächtig ist er.
Der Gewinner wird per Abstimmung ermittelt. Die meisten Stimmen nach ungefähr 10 Tagen nach der ersten gültigen Einreichung gewinnen. Im Allgemeinen sollten Antworten, bei denen der Code leicht zu lesen und zu verstehen ist, der Fehler jedoch gut versteckt ist und selbst wenn er entdeckt wird, eher auf einen Fehler als auf Böswilligkeit zurückgeführt werden kann, positiv bewertet werden. Ebenso sollte es viel mehr wert sein, wenn der Fehler nur ein falsches Ergebnis verursacht, anstatt nur das Programm zum Absturz zu bringen oder nichts zu tun.
Wie üblich behalte ich mir das Recht vor, eine Antwort als Gewinner zu wählen, wenn sie nach subjektiven Kriterien nicht mehr als 10% oder 1 Punkt unter derjenigen mit den meisten Stimmen liegt.
make (1)
funktioniert das auf praktisch jeder Unix-Box und auf einigen Windows-Boxen nicht richtig. Nicht wegen der Betriebssysteme, sondern wegen der Dateisysteme. Jedes Dateisystem, das das Änderungsdatum von Dateien mit geringer Genauigkeit speichert,make
funktioniert auf einem schnellen Computer möglicherweise nicht ordnungsgemäß.Antworten:
Unix-Shell + Standard-Dienstprogramme
Schreiben wir ein Shell-Skript, das den Prozess (im Besitz eines Benutzers) findet, der die meiste CPU-Zeit verbraucht hat, und alle Prozesse mit demselben Namen beendet. Ich nehme an, das gilt als Einlesen von Daten (aus dem System) und Ausführen einer Berechnung. (Dieses Verhalten kann bei Prozessen hilfreich sein, die viele Prozesse blockieren, z. B. Gabelbomben und Google Chrom.)
Das Folgende sollte ein portabler Weg sein, um den Namen des Prozesses mit der größten CPU-Zeit zu ermitteln (ich habe versucht, offensichtliche Linux-Probleme zu vermeiden, habe ihn aber nicht unter Solaris getestet):
Also unser Drehbuch ist einfach
Führen Sie das Programm als root aus, um die besten Ergebnisse zu erzielen, damit Prozesse anderer Benutzer beendet werden können.
Linux und BSD
Dies funktioniert unter Linux und sollte auf den BSDs funktionieren, da
killall arg
die genannten Prozesse abgebrochen werdenarg
.Solaris
Wenn jedoch ein Benutzer unter Solaris ein Programm mit dem Namen
9
in einer Endlosschleife ausführt, wird das System durch das Skript heruntergefahren . Das ist weil:NB
quelle
killall
ist kein Beispiel. Das sind nur zwei verschiedene Programme mit dem gleichen Namen. Jede Version funktioniert einwandfrei.Python
Dieses Programm öffnet das in der Befehlszeile angegebene Bild und zeigt es an.
Funktioniert unter Linux, funktioniert nicht unter Windows.
Dies liegt an der Art und Weise, wie Windows Dateien öffnet. Damit dies auf allen Betriebssystemen ordnungsgemäß funktioniert, muss der Binärmodus angegeben werden.
quelle
Little Endian (Intel x86) gegen Big Endian (IBM Power7)
Jedes Dateiformat, in dem binäre Multibyte-Mengen in Nicht-Host-Reihenfolge vorliegen, kann falsch interpretiert werden. Hier ist eine Funktion, die rohes Audio annimmt, beispielsweise aus einer WAV-Datei (einem Microsoft Little Endian-Dateiformat) extrahiert, die Amplitude halbiert und das gedämpfte Audio ausgibt.
Auf kleinen Endian-Maschinen funktioniert dies hervorragend, aber auf großen Endian-Maschinen ist es eine Katastrophe. Z.B
Rechtsverschiebung auf Little Endian:
Rechtsverschiebung auf Big Endian:
Beachten Sie, dass einige der Nybbles korrekt sind! Tatsächlich ist es eine 50: 50-Chance, dass die Ausgabe korrekt ist, abhängig davon, ob das niedrigstwertige Bit des Sound-Samples 0 oder 1 ist!
Wenn Sie also dieses Audio hören, ist es wie eine halbe Amplitude, aber mit einem lauten, hohen Rauschen überlagert. Ziemlich überraschend, wenn Sie nicht darauf vorbereitet sind!
quelle
AGB
Auf dem Computer funktioniert es, aber auf meinem TI-84-Rechner nicht. Warum?
quelle
C
Diese Lösung für Problem 100 (über die Collatz-Sequenz) wird von UVa Online Judge akzeptiert.
Dieser Code funktioniert jedoch nur bei * nix- Plattformen , da
long
type als 64-Bit-Ganzzahl mit Vorzeichen implementiert ist. Unter Windows ruft der Code ein undefiniertes Verhalten auf, da derlong
Typ als 32-Bit-Ganzzahl mit Vorzeichen implementiert ist, während einer der Zwischenwerte incyc()
function mindestens 32-Bit für die Darstellung benötigt.Eine andere Möglichkeit, dies weiter inkompatibel zu machen, besteht darin, das Array zu platzieren
l
einzubauenmain()
und entsprechende Änderungen an dercyc()
Funktion vorzunehmen . Da die ausführbare Datei unter Windows standardmäßig auf die Anforderung eines 2-MB-Stacks eingestellt ist, stürzt das Programm sofort ab.quelle
Python
Ich bin auf StackOverflow darauf gestoßen als nach Eingabe-Timeouts gesucht habe.
Dies funktioniert nicht für Windows.
quelle
conio.h
hätte den gleichen Effekt, aber C wird nicht einmal kompiliert.Linux + Bash + GNU Coreutils
Dadurch wird der Stammordner und alles, was in Windows nicht vorhanden ist, gelöscht, auch wenn Sie bash für Windows installieren :)
quelle
cmd.exe
und zu tippen, umrm
zu sehen, dass es nicht funktioniert.