Comportamento indefinido matou meu gato
É bem sabido que um comportamento indefinido pode matar seu gato [carece de fontes?] .
Mas pode?
Sua tarefa
- Escreva um programa que invoque um comportamento indefinido.
- Descreva um cenário que começa com o programa acima sendo executado, resultando em um Felus catus terminando sua vida enquanto você pertence, como resultado do UB mencionado acima.
- Estime a probabilidade de cada estágio do cenário.
- Calcule a probabilidade total de que uma única execução do programa mate seu gato.
Regras
- Este é um concurso de popularidade ; portanto, seja criativo, se puder.
- Esse é um desafio relacionado à programação; portanto, a cadeia de eventos deve estar principalmente dentro do computador, não no mundo real (é claro, se for necessário alcançar o mundo real, se é onde está o seu gato).
- Se você escolher um idioma que não tenha um comportamento indefinido, use algo semelhante.
- Nenhum animal pode ser prejudicado na produção de sua resposta.
Pontuação
A contagem de votos mais a probabilidade total do cenário (que não pode exceder 1).
Exemplo em C:
main(){printf();}
Cenário:
printf
chamado com lixo da pilha - comportamento indefinido. Probabilidade: 100%.- O primeiro parâmetro é a string
Your cat is ugly!
. Probabilidade: (1/256) 17 = (1,148 * 10 -37 )%. - Vendo a mensagem, você pega sua arma e atira no seu gato. Probabilidade: 3%.
- O gato morre. Probabilidade: 93%.
Probabilidade total: (3.202 * 10 -39 )%.
popularity-contest
Ugoren
fonte
fonte
cat
comando ou algo desse tipo.Respostas:
C
A maioria das respostas para essa pergunta interpretou mal a pergunta, pois estava matando o
cat
processo em um sistema UNIX. Aqui está um programa que pode causar o desaparecimento de uma forma de vida biológica da espécie Felis Cattus, conforme especificado pela pergunta.Este exemplo é executado no Windows, mas pode ser facilmente transportado para a maioria dos sistemas operacionais UNIX, substituindo
iexplore -k
pelo comando para ativar um navegador da Web instalado.Este programa pretende fornecer conselhos sobre a dieta do gato ao usuário.
Ele iniciará o Internet Explorer e direcionará o usuário para troca de pilha de animais de estimação, listando muitas perguntas úteis sobre como alimentar gatos. Há, no entanto, uma chance baixa (1/256) de enviar o usuário para cozinhar a troca de pilhas, listando dicas de como preparar pratos contendo chocolate, que é altamente tóxico para gatos . Para piorar as coisas, ele iniciará o Internet Explorer no modo quiosque (tela cheia), que oculta a barra de endereços e é difícil escapar para um usuário não especialista em tecnologia.
Esse truque inteligente convencerá o usuário a alimentar o chocolate de seu gato, acreditando que é uma dieta apropriada para ele, fazendo com que ele o mate inadvertidamente.
fonte
Bater
De acordo com isso ,
INT_MIN % -1
pode ou não ser indefinido (o que ???) e, portanto, pode causar problemas para qualquer linguagem implementada em c / c ++.Ele
cat
será eliminado mais cedo se obash
processo pai travar, o que pode ou não ocorrer.Na minha VM, recebo esta saída:
(Eu realmente não entendo a pontuação desta pergunta, mas aqui vai mesmo assim)
Calcular
$((2**63%-1))
. O travamento sempre acontece no bash 4.2.25, mas parece travar apenas em algumas versões 3.x. Mais incerteza. Eu poderia lhe dizer a probabilidade exata, mas devido ao princípio da incerteza de Heisenburg, eu caía em um buraco negro. Ou alguma coisa. Então, acho que podemos dizer com segurança que a probabilidade é de aproximadamente 42%.fonte
echo $((-2**63/-1)) | cat
cat
.INT_MAX = 2^63 - 1
. Se adicionarmos 1 aINT_MAX
, o espaço numérico de 64 bits será contornado e chegaremosINT_MIN
. Em outras palavras, na aritmética inteira assinada de 64 bits2^63 == -2^63
,. Eu poderia ter usado-2**63
, mas preferi a dispersão sem a-
, pois a aritmética modular é a mesma neste caso.C (ponto de sequência)
deadcat.c:
Execução (ou não):
Cenário e probabilidade
Supondo que cinco por cento das pessoas que executam este programa usem clang para compilar o código C (contra 90% usando o gcc e 5% usando outros compiladores C):
Explicação:
k = i + (++ i) acessa e altera "i" entre pontos de sequência. A probabilidade não é determinável pelo programa; depende da escolha do compilador, que é feita pelo usuário. "Indefinido" não significa necessariamente "aleatório".
Consulte https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points
fonte
C
História de fundo
Minha esposa herdou um gato da família. † Infelizmente, sou muito alérgico a animais. A gata já tinha passado do auge e deveria ter sido sacrificada antes mesmo de a conseguirmos, mas não conseguiu livrar-se dela devido ao seu valor sentimental. Eu travei um plano para acabar com
meusofrimento.Estávamos saindo de férias prolongadas, mas ela não queria embarcar no gato no consultório do veterinário. Ela estava preocupada com o fato de contrair doenças ou ser maltratada. Criei um alimentador automático de gatos para que pudéssemos deixá-lo em casa. Eu escrevi o firmware do microcontrolador em C. O arquivo que contém
main
parecia semelhante ao código abaixo.No entanto, minha esposa também é programadora e conhecia meus sentimentos em relação ao gato, por isso insistiu em uma revisão de código antes de concordar em deixá-lo em casa sem vigilância. Ela tinha várias preocupações, incluindo:
main
não possui uma assinatura compatível com os padrões (para uma implementação hospedada)main
não retorna um valortempTm
é usado não inicializado, poismalloc
foi chamado em vez decalloc
malloc
não deve ser convertidoelapsedTime
variável pode não ter alcance suficienteDemorou muito para convencer, mas ela finalmente concordou que essas teses não eram problemas por várias razões (não doeu que já estávamos atrasados para o nosso voo). Como não havia tempo para testes ao vivo, ela aprovou o código e saímos de férias. Quando voltamos, algumas semanas depois, a miséria do
meugato havia acabado (embora, como resultado, agora eu tenha muito mais).† Cenário totalmente fictício, sem preocupações.
Código
Comportamento indefinido:
Para aqueles que não querem se incomodar em encontrar o UB:
Probabilidade de matar o gato:
Estimo que o gato morra com probabilidade de 0,995 .
fonte
&
no memcpy, certo?cat
.bater
Versão clássica
Tem a vantagem de matar todos os gatos em seu alcance.
Observe que o processo é interrompido imediatamente, portanto, a única maneira de finalizá-lo com uma única chamada de pkill é enviar SIGKILL (9).
Portanto:
p(SUCCESS) = p(RANDOM == 9) = 0.0275 %
Versão quântica
Probabilidade de matar o gato durante o experimento: 50%
fonte
cat &
tenta ler do terminal, mas não consegue. Qualquer um dos sinais que você mencionou (e mais alguns) funcionará se você enviar o SIGCONT (18) posteriormente. Além disso, eu concordo que desligar e encerrar o gato seria o mesmo que matá- lo, mas interrompê- lo não parece satisfatório ...: PC
Note que isso só funciona no Linux.
Probabilidade total: 1x10 ^ -99999999999999999999999999999999999999999999999999999999999999, aprox.
fonte
C ++
Seu gato está morto e vivo até que você esteja curioso. Então você percebe que há uma probabilidade de 0,5 que seu gato esteja morto.
fonte
this->m_dead
depoisdelete this
?ö
não parece ser um símbolo válido em C ++. Talvez substitua poroe
.C
Executa no Linux.
Probabilidade de matar o gato: 1/256 (O
sleep(1)
retorno 0, então será morto sex
for zero.)Como bônus, mata todos os gatos atualmente em execução no seu sistema.
Se você odeia tanto gatos, apresento a você:
A Centopéia de Gato (Festança)
Com base no fato de que, em The Human Centopede (First Sequence) , todos os três cães da centopéia de cães morreram e duas em cada três pessoas da centopéia humana morreram, eu estimo que a probabilidade de matar um gato seja 5/6.
fonte
Javascript
Execução:
"Cat is fine"
"Cat is dead"
Explicação:
Citando Glenn Randers-Pehrson, a probabilidade não é determinável pelo programa; isso depende da escolha do navegador, feita pelo usuário.
fonte
A leitura de um valor da função que deveria retornar um valor resulta em comportamento indefinido. Agora, é óbvio, [citação necessário] que "toda vez que você alcança um comportamento indefinido, Deus mata um gatinho". Usando isso, concluímos:
Pode ser facilmente estendido por loop para exterminar todos os gatos do mundo.
fonte
Java (Coleta de Lixo)
Embora o código possa chamar System.gc () is não garante que o Garbage Collector colete todos os objetos não utilizados. Assim, para o código a seguir, é imprevisível se o gato será morto ou não.
A probabilidade não pode ser calculada.
Observe que ainda há uma chance de o gato ser "revivido" se houver uma alternância de contexto no thread do GC após o sysout e antes do System.exit (0), mas eu preferi não cobri-lo para manter o conceito mais simples.
fonte
System.out.close()
após aSystem.out.println("Cat is still alive.");
linha.Alguém que pensou em realmente matar (a)
cat
?Probabilidade de
cat
morrerPela probabilidade ... acho que precisamos distinguir alguns casos:
cat
s é muito baixa, pode-se assumir com segurança zero. Se ele tiver o Cygwin instalado, ele contará como usuário unix.cat
falha.cat
s com uma chance de 1/6, ele provavelmente a repetirá até que algo inesperado ocorra. Sem perda de generalidade, presumocat
que definitivamente morrerá.A probabilidade geral depende de como os usuários são misturados e é difícil de determinar. Mas certamente podemos dizer: o Windows é um local seguro para gatinhos.
Testando a obediência às regras
Isso não matou animais, a resposta é aprovada pela American Humane Association .
prova claramente que
cat
não é animal (desdefile
que não conheça nenhum tipo de herança de tipo de arquivo oculto).fonte
C
Se o nome do seu gato for muito longo, ele morre.
gets
causa mortes de gatos, juntamente com outros problemas.fonte
Haskell
Aqui, aplicamos
unsafePerformIO
a uma ação que tem efeitos colaterais observáveis . Esse é sempre um comportamento indefinido, pelo menos assim é a ordem dos efeitos. Então, ou o programa falhará primeiro ao tentar avaliarundefined
(aquele, ironicamente, não é um comportamento indefinido: nunca deve gerar um valor que permita ao programa continuar com outra coisa), ou de fato incorrerá na grave crise internacional efeitos colaterais. Nesse caso, a chance de sobrevivência é de apenas 0,001% .Probabilidade de matar o gato assim: 49.9995%.
fonte
Qui
Como a pergunta permite um idioma que não tenha um comportamento indefinido, desde que o efeito seja semelhante, escolhi Thue pelo seu não determinismo na escolha de qual regra executar quando houver mais de uma regra que pode ser aplicada na atual Estado.
O programa será alimentado no controlador por um forno de microondas, dentro do qual está o meu gato. A porta do forno micro-ondas está fechada e reforçada por uma gravata. A saída do programa decidirá se o forno de microondas começa a microondas o gato ou não.
A probabilidade de matar o gato depende da implementação do intérprete, mas digamos que seja 50%. Então a probabilidade de o gato morrer é 0,5 .
fonte
Math.random()
por exemplo, não é um comportamento indefinido, apenas um comportamento imprevisível.3. If you choose a language that doesn't have undefined behavior, use something similar.
Java
De acordo com as especificações,
java.util.Date
terá um comportamento indefinido. Então tente a sua sorte:fonte