Wszyscy wiemy, w jaki sposób dyskusja o tym, który system operacyjny jest najlepszy, wywołała wiele wojen ogniowych. Twoim celem jest teraz dostarczenie decydującego „dowodu”, że twój ulubiony system operacyjny jest lepszy ... ach, nie, znacznie lepiej, dostarczenie decydującego „dowodu”, że inny system operacyjny jest zły.
Zadanie: Napisz program, który wykonuje pewne obliczenia i działa poprawnie na co najmniej jednym systemie operacyjnym, a niepoprawnie na co najmniej innym.
- program powinien wykonać co najmniej kilka obliczeń, więc musi odczytać proste dane wejściowe (najlepiej na standardowym wejściu, lub jeśli z plików, jeśli chcesz, ale niewłaściwe użycie małego endiana / dużego endiana byłoby nie tylko tanie, ale także oczywiste) , i zapewniają pewną moc wyjściową w zależności od danych wejściowych. Obliczenia powinny być znaczące i uzasadnione, na przykład rozwiązanie prawdziwego życia lub problemu matematycznego.
- powinieneś określić oba systemy operacyjne, wskazując, na którym będzie działał poprawnie, a na którym nie. Oba systemy operacyjne powinny być dobrze znane i mniej więcej w tym samym czasie (więc nie ma DOS 1.0 w porównaniu do nowoczesnego systemu operacyjnego). Zaleca się krótki opis przyczyny różnicy (zwłaszcza jeśli podejrzewasz, że wiele osób nie zdaje sobie z tego sprawy) w tagach spoiler.
lubię to
przyczyna różnicy musi być subtelna, więc nie,
#ifdef _WIN32
lub podobna, proszę! Pamiętaj, że Twoim celem jest „udowodnienie”, że ten konkretny system jest zły, więc ludzie nie powinni (natychmiast) dostrzegać twojej sztuczki!jeśli w twoim kodzie jest bardzo dziwna lub bardzo nietypowa część, musisz uzasadnić to w komentarzach, dlaczego tak jest. Oczywiście to „uzasadnienie” może / będzie wielkim kłamstwem.
Punktacja:
To nie jest golf! Kod powinien być dobrze zorganizowany i prosty. Pamiętaj, że Twoim celem jest ukrywanie w nim błędu, aby ludzie go nie podejrzewali. Im prostszy kod, tym mniej podejrzliwy.
Zwycięzca zostanie wyłoniony w drodze głosowania. Najwięcej głosów po około 10 dniach od pierwszego ważnego zgłoszenia wygrywa. Ogólnie rzecz biorąc, odpowiedzi, w których kod jest łatwy do odczytania i zrozumienia, ale błąd jest dobrze ukryty, a nawet jeśli zostanie wykryty, można przypisać błędowi, a nie złośliwości, należy głosować. Podobnie, powinno być warte znacznie więcej, jeśli błąd powoduje tylko niepoprawny wynik, a nie tylko powoduje awarię programu lub nic nie robi.
Jak zwykle odmawiam sobie prawa wyboru odpowiedzi jako zwycięzcy, jeśli nie będzie ona wyższa niż 10% lub 1 punkt poniżej tej z największą liczbą głosów, według dowolnych subiektywnych kryteriów.
make (1)
działa poprawnie na zasadniczo każdym pudełku unixowym i nieprawidłowo na niektórych oknach Windows. Nie z powodu systemów operacyjnych, ale z powodu systemów plików. Każdy system plików, który utrzymuje daty modyfikacji plików z niską precyzją, może nie działaćmake
poprawnie na szybkim komputerze.Odpowiedzi:
Powłoka Unix + standardowe narzędzia
Napiszmy skrypt powłoki, który znajdzie proces (należący do dowolnego użytkownika), który wykorzystał najwięcej czasu procesora, i zabije wszystkie procesy o tej samej nazwie. Przypuszczam, że liczy się to jako wczytywanie danych (z systemu) i wykonywanie obliczeń. (Takie zachowanie może być przydatne w przypadku procesów, które dzielą wiele procesów, takich jak bomby widełkowe i Google Chromium).
Poniższy opis powinien być przenośnym sposobem na uzyskanie nazwy procesu o największym czasie procesora (starałem się unikać oczywistych Linuxism, ale nie testowałem go na Solarisie):
Więc nasz skrypt jest po prostu
Uruchom jako root, aby uzyskać najlepsze wyniki, aby mógł zabijać procesy innych użytkowników.
Linux i BSD
Działa to w systemie Linux i powinno działać na BSD, ponieważ
killall arg
zabija nazwane procesyarg
.Solaris
Jednak w systemie Solaris, jeśli użytkownik uruchamia program o nazwie
9
w nieskończonej pętli, skrypt spowoduje wyłączenie systemu . To dlatego, że:NB
źródło
killall
to nie przykład. To tylko dwa różne programy o tej samej nazwie. Każda wersja działa poprawnie.Pyton
Ten program otwiera obraz określony w wierszu poleceń i wyświetla go.
Działa na systemie Linux, nie działa na systemie Windows.
Wynika to ze sposobu, w jaki system Windows otwiera pliki. Należy określić tryb binarny, aby działał poprawnie we wszystkich systemach operacyjnych.
źródło
Little Endian (Intel x86) vs. Big Endian (IBM Power7)
Każdy format pliku, w którym występują wielobajtowe ilości binarne w kolejności innej niż host, może zostać źle zinterpretowany. Oto funkcja, która pobiera surowy dźwięk, powiedzmy wyodrębniony z pliku WAV (który jest formatem Microsoft Endian), zmniejsza o połowę amplitudę i wysyła tłumiony dźwięk.
W małych maszynach Endian działa to świetnie, ale w dużych maszynach Endian jest to katastrofa. Na przykład
Przesuń w prawo na małym endianie:
Przesuń w prawo na big endian:
Pamiętaj, że niektóre z nybbles są poprawne! W rzeczywistości jest szansa 50:50, że wyjście będzie poprawne, w zależności od tego, czy najmniej znaczący fragment próbki dźwięku ma wartość 0 czy 1!
Więc kiedy słuchasz tego dźwięku, jest to jak połowa amplitudy, ale z szumem głośnym, wysokim tonem. Zaskakujące, jeśli nie jesteś na to przygotowany!
źródło
GTB
Na komputerze to działa, ale na moim kalkulatorze TI-84 tak nie jest. Czemu?
źródło
do
To rozwiązanie problemu 100 (o sekwencji Collatza) jest akceptowane przez UVa Online Judge.
Jednak ten kod działa poprawnie tylko na platformie * nix , ponieważ
long
typ jest implementowany jako 64-bitowa liczba całkowita ze znakiem. W systemie Windows kod wywołuje niezdefiniowane zachowanie, ponieważlong
typ jest implementowany jako 32-bitowa liczba całkowita ze znakiem, podczas gdy jedna z wartości pośrednich wcyc()
funkcji musi reprezentować co najmniej 32-bit.Innym sposobem uczynienia tego bardziej niezgodnym jest umieszczenie tablicy w
l
środkumain()
i dokonanie odpowiednich zmian wcyc()
funkcji. Ponieważ plik wykonywalny jest domyślnie ustawiony tak, aby żądał stosu 2 MB w systemie Windows, program natychmiast ulega awarii.źródło
Pyton
Natknąłem się na to na StackOverflow, kiedy szukałem limitów wejściowych.
To nie działa w systemie Windows.
źródło
conio.h
miałoby taki sam efekt, ale C nawet się nie skompiluje.Linux + bash + GNU coreutils
Spowoduje to usunięcie folderu głównego i wszystkiego, co nie istnieje w systemie Windows, nawet jeśli zainstalujesz bash dla systemu Windows :)
źródło
cmd.exe
i pisania,rm
aby zobaczyć, że to nie działa.