Все мы знаем, как дискуссия о том, какая операционная система является лучшей, вызвала много пламенных войн. Теперь ваша цель - предоставить решающее «доказательство» того, что ваша любимая операционная система лучше ... ах, нет, намного лучше, предоставить решающее «доказательство» того, что другая операционная система плохая.
Задача: написать программу, которая выполняет некоторые вычисления, и она работает корректно как минимум на одной ОС и неправильно на хотя бы еще одной.
- программа должна выполнить, по крайней мере, некоторые вычисления, поэтому она должна прочитать какой-то простой ввод (предпочтительно на стандартный ввод или, если хотите, из файлов, но неправильное использование байтов с прямым и обратным порядком байтов не только будет дешевым, но и очевидным) , и предоставить некоторый вывод в зависимости от ввода. Расчеты должны быть осмысленными и обоснованными, например, решение реальной жизни или математическая задача.
- Вы должны указать обе операционные системы, указав, какая из них будет работать правильно, а какая - нет. Обе операционные системы должны быть хорошо известны и примерно в одно и то же время (поэтому не DOS 1.0, а современная ОС). Рекомендуется предоставить краткое описание причины разницы (особенно если вы подозреваете, что многие этого не осознают) в тегах спойлера.
так
причина разницы должна быть тонкой, поэтому нет
#ifdef _WIN32
или похожее, пожалуйста! Помните, ваша цель состоит в том, чтобы «доказать», что эта конкретная система плохая, поэтому люди не должны быть в состоянии (немедленно) определить ваш трюк!если в вашем коде есть очень странная или очень необычная часть, вы должны обосновать это в комментариях, почему она есть. Конечно, это «оправдание» может / будет большой ложью.
Подсчет очков:
Это не гольф! Код должен быть хорошо организован и прост. Помните, ваша цель состоит в том, чтобы скрыть ошибку, чтобы люди не подозревали об этом. Чем проще код, тем менее подозрительным он является.
Победитель будет определен голосованием. Большинство голосов спустя приблизительно 10 дней после первого действительного представления выигрывает. Как правило, следует голосовать за ответы, в которых код легко читается и понимается, но ошибка хорошо скрыта, и даже если она обнаружена, ее можно отнести к ошибке, а не к злобе. Точно так же, это должно стоить гораздо больше, если ошибка просто приводит к неверному результату, а не просто вызывает сбой программы или ее отсутствие.
Как обычно, я оставляю за собой право выбрать ответ в качестве победителя, если он не превышает 10% или 1 балл ниже того, который набрал наибольшее количество голосов, по любым субъективным критериям.
make (1)
работает правильно практически на каждом Unix-боксе и неправильно на некоторых Windows-боксах. Не из-за ОС, а из-за файловых систем. Любая файловая система, которая сохраняет даты изменения файлов с низкой точностью, может работатьmake
неправильно на быстрой машине.Ответы:
Unix shell + стандартные утилиты
Давайте напишем сценарий оболочки, который находит процесс (принадлежащий любому пользователю), который использовал наибольшее количество процессорного времени, и убивает все процессы с одинаковыми именами. Я предполагаю, что это считается как чтение данных (из системы) и выполнение расчета. (Такое поведение может быть полезно для процессов, которые разветвляются на многие процессы, такие как разветвления и Google Chromium.)
Следующее должно быть портативным способом получения имени процесса с наибольшим временем ЦП (я пытался избежать явных Linuxism, но не проверял его на Solaris):
Так что наш сценарий просто
Запустите от имени пользователя root для достижения наилучших результатов, чтобы он мог убивать процессы других пользователей.
Linux и BSD
Это работает на Linux и должно работать на BSD, потому что
killall arg
убивает названные процессыarg
.Solaris
Однако в Solaris, если пользователь запускает программу
9
с бесконечным циклом, сценарий отключит систему . Это потому что:NB
источник
killall
это не пример. Это просто две разные программы с одинаковыми именами. Каждая версия работает правильно.питон
Эта программа открывает изображение, указанное в командной строке, и отображает его.
Работает на Linux, не работает на Windows.
Это связано с тем, как Windows открывает файлы. Для правильной работы всех операционных систем необходимо указать двоичный режим.
источник
Little Endian (Intel x86) против Big Endian (IBM Power7)
Любой формат файла, в котором присутствуют многобайтовые двоичные величины в не хостовом порядке, рискует быть неверно истолкованным. Вот функция, которая принимает необработанный звук, скажем, извлеченный из файла WAV (который является форматом файла с прямым порядком байтов Microsoft), делит пополам амплитуду и выводит ослабленный звук.
На машинах с прямым порядком байтов это прекрасно работает, но на машинах с большим порядком байтов это катастрофа. Например
Сдвиг вправо по порядку байтов:
Сдвиг вправо на старшем порядке:
Обратите внимание, что некоторые из них правильны! Фактически, вероятность того, что выходной сигнал будет правильным, составляет 50:50, в зависимости от того, равен ли младший бит сэмпла звуку 0 или 1!
Поэтому, когда вы слушаете этот звук, он похож на половину амплитуды, но с наложенным каким-то резким громким высокочастотным шумом. Довольно поразительно, если вы не готовы к этому!
источник
GTB
На компьютере это работает, а на моем калькуляторе TI-84 - нет. Зачем?
источник
С
Это решение проблемы 100 (о последовательности Коллатца) принимается UVa Online Judge.
Однако этот код корректно работает только на платформе * nix, поскольку
long
тип реализован как 64-разрядное целое число со знаком. В Windows код вызывает неопределенное поведение, так какlong
тип реализован как 32-разрядное целое число со знаком, в то время как для представления одного из промежуточных значений вcyc()
функции требуется как минимум 32-разрядное значение.Еще один способ сделать это еще более несовместимым - поместить массив
l
внутрьmain()
и внести соответствующие изменения вcyc()
функцию. Поскольку исполняемый файл по умолчанию настроен на запрос стека 2 МБ в Windows, программа сразу падает.источник
питон
Я сталкивался с этим в StackOverflow при поиске таймаутов ввода.
Это не работает для Windows.
источник
conio.h
будет иметь тот же эффект, но C даже не скомпилируется.Linux + bash + GNU coreutils
Это удалит корневую папку и все, что в ней не существует в Windows, даже если вы установите bash для Windows :)
источник
cmd.exe
и набрать,rm
чтобы увидеть, что это не работает.