Todos sabemos como a discussão sobre qual é o melhor sistema operacional causou muitas guerras de chamas. Seu objetivo agora é fornecer "provas" decisivas de que seu sistema operacional favorito é melhor ... ah, não, muito melhor, fornecer "provas" decisivas de que outro sistema operacional é ruim.
A tarefa: escreva um programa que faça alguns cálculos e funcione corretamente em pelo menos um SO e incorretamente em pelo menos outro.
- o programa deve fazer pelo menos alguns cálculos; portanto, é necessário ler algumas entradas simples (de preferência na entrada padrão, ou se for de arquivos, se você quiser, mas o uso indevido de little endian / big endian não seria apenas barato, mas também óbvio) , e forneça alguma saída, dependendo da entrada. Os cálculos devem ser significativos e justificados, por exemplo, resolver uma vida real ou um problema matemático.
- você deve especificar os dois sistemas operacionais, indicando em qual deles funcionará corretamente e em qual não. Ambos os sistemas operacionais devem ser bem conhecidos e aproximadamente ao mesmo tempo (portanto, não há DOS 1.0 versus um sistema operacional moderno). É aconselhável fornecer uma breve descrição sobre a causa da diferença (especialmente se você suspeitar que muitas pessoas não perceberiam) em tags de spoiler.
como isso
a causa da diferença tem que ser sutil, então não
#ifdef _WIN32
ou similar, por favor! Lembre-se, seu objetivo é "provar" que esse sistema específico é ruim, para que as pessoas não possam (imediatamente) descobrir seu truque!se houver uma parte muito estranha ou muito incomum no seu código, você deverá justificá-lo nos comentários por que ele está lá. Obviamente, essa "justificativa" pode / será uma grande mentira.
Pontuação:
Isto não é um golfe! O código deve ser bem organizado e simples. Lembre-se, seu objetivo é ocultar um bug para que as pessoas não suspeitem. Quanto mais simples o código, menos suspeito é.
O vencedor será decidido por votos. O maior número de votos após aproximadamente 10 dias após o primeiro envio válido vence. Geralmente, as respostas em que o código é fácil de ler e entender, mas o bug está bem oculto e, mesmo se descoberto, podem ser atribuídas a um erro e não à malícia, devem ser votadas. Da mesma forma, deve valer muito mais se o erro causar apenas um resultado incorreto, em vez de apenas causar a falha do programa ou não fazer nada.
Como sempre, detenho o direito de escolher uma resposta como vencedora se ela não estiver mais de 10% ou 1 ponto abaixo da que tiver mais votos, em qualquer critério subjetivo.
make (1)
funciona corretamente em essencialmente todas as caixas unix e indevidamente em algumas caixas de janelas. Não por causa dos sistemas operacionais, mas por causa dos sistemas de arquivos. Qualquer sistema de arquivos que mantém as datas de modificação de arquivos com baixa precisão pode não funcionarmake
adequadamente em uma máquina rápida.Respostas:
Shell Unix + utilitários padrão
Vamos escrever um script de shell que encontre o processo (de propriedade de qualquer usuário) que tenha usado mais tempo de CPU e mate todos os processos com o mesmo nome. Suponho que isso conte como leitura de dados (do sistema) e execução de um cálculo. (Esse comportamento pode ser útil para processos que realizam muitos processos, como fork-pumps e Google Chromium.)
A seguir, deve ser uma maneira portátil de obter o nome do processo com o maior tempo de CPU (tentei evitar Linuxismos óbvios, mas não o testei no Solaris):
Portanto, nosso script é simplesmente
Execute como root para obter melhores resultados, para que ele possa matar processos de outros usuários.
Linux e BSD
Isso funciona no Linux e deve funcionar nos BSDs, porque
killall arg
mata os processos nomeadosarg
.Solaris
No entanto, no Solaris, se um usuário estiver executando um programa nomeado
9
em um loop infinito, o script derrubará o sistema . Isto é porque:NB
fonte
killall
não é um exemplo. Que apenas dois programas diferentes com o mesmo nome. Cada versão está funcionando corretamente.Python
Este programa abre a imagem especificada na linha de comando e a exibe.
Funciona no Linux, não funciona no Windows.
Isso ocorre devido à maneira como o Windows abre arquivos. O modo binário deve ser especificado para que isso funcione corretamente em todos os sistemas operacionais.
fonte
Little Endian (Intel x86) vs. Big Endian (IBM Power7)
Qualquer formato de arquivo em que haja quantidades binárias de vários bytes em ordem não-host corre o risco de ser mal interpretado. Aqui está uma função que pega o áudio bruto, extraído de um arquivo WAV (que é um formato de arquivo little endian da Microsoft), reduz pela metade a amplitude e emite o áudio atenuado.
Em pequenas máquinas endian, isso funciona muito bem, mas em grandes máquinas endian é um desastre. Por exemplo
Mude para a direita no little endian:
Mude para a direita na big endian:
Note que alguns dos nybbles estão corretos! De fato, é uma chance de 50:50 que a saída esteja correta, dependendo se o bit menos significativo da amostra de som é 0 ou 1!
Portanto, quando você ouve esse áudio, é como meia amplitude, mas com algum ruído agudo estridente sobreposto. Muito surpreendente se você não estiver preparado para isso!
fonte
GTB
No computador, ele funciona, mas na minha calculadora TI-84, não. Por quê?
fonte
C
Esta solução para o problema 100 (sobre a sequência Collatz) é aceita pelo UVa Online Judge.
No entanto, esse código funciona apenas corretamente na plataforma * nix , pois o
long
tipo é implementado como número inteiro assinado de 64 bits. No Windows , o código chama um comportamento indefinido, pois olong
tipo é implementado como número inteiro assinado de 32 bits, enquanto um dos valores intermediários nacyc()
função precisa de pelo menos 32 bits para representar.Outra maneira de tornar isso ainda mais incompatível é colocar a matriz
l
dentromain()
e fazer as alterações correspondentes paracyc()
funcionar. Como o executável está definido para solicitar uma pilha de 2 MB por padrão no Windows, o programa falha imediatamente.fonte
Python
Me deparei com isso no StackOverflow ao procurar tempos limite de entrada.
Isso não funciona no Windows.
fonte
conio.h
teria o mesmo efeito, mas C nem compilará.Linux + bash + núcleo GNU
Isso apagará a pasta raiz e tudo o que não existe no Windows, mesmo se você instalar o bash para Windows :)
fonte
cmd.exe
e digitarrm
para ver se não funciona.