Escreva um código perfeitamente legal em um idioma decente de sua escolha cuja compilação trava o compilador ou o envia para um loop infinito (tempo infinito de compilação).
Restrições:
- Use um idioma padrão usado no mundo real.
- Use um compilador padrão e bem desenvolvido (nenhuma resposta como "eu escrevi meu compilador C que trava em tudo").
- O código deve ser legal no idioma (portanto, você provavelmente terá que explorar um compilador ou um bug no idioma).
- Forneça a versão do compilador e as opções usadas para que outras pessoas possam replicá-lo.
- Explique por que o compilador travou, se possível.
Diverta-se :)
popularity-contest
compile-time
Petr Pudlák
fonte
fonte
Respostas:
Tenho certeza de que foi corrigido agora, mas costumava ser possível travar o compilador Java (ou travar o Eclipse) escrevendo
http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
Na verdade, de acordo com essa página, o compilador travará, não travará. Ainda assim, achei que foi bem divertido.
fonte
Minha solução favorita para o GHC:
Para GHC 6.12.1 ambos
ghci Bad.hs
eghc Bad.hs
laço infinitamente. O GHC 7.4.1 faz loop infinitamente quandoghc -O2 Bad.hs
é executado.Explicação:
omega
é definida usando uma recursão infinita (a única maneira de ele habitar qualquer tipo). O inliner do compilador vêxx
como uma função simples e não recursiva; portanto, tenta incorporá-lo na definição deomega
. Isso resulta em(\x@(C x') -> x' x) (C xx)
. Vendo uma correspondência de padrões em um construtor, o compilador tenta reduzi-lo, obtendoxx (C xx)
novamente e fazendo loops. O truque é quexx
é realmente recursivo, mas a recursão está oculta no tipo de dados.Nota: Ao escrever o quebra-cabeça, esqueci que deixei o GHC rodando no loop infinito. Levou toda a minha memória, travou o Firefox e eu mal consegui matá-lo sem reiniciar o hardware.
fonte
Isso é fácil em qualquer linguagem de tipo dependente . A verificação geral de tipos dependentes é indecidível, pois pode exigir cálculos arbitrariamente complexos (Turing-complete). Você pode simplesmente codificar em um tipo dependente um valor muito grande. Em seguida, o verificador de tipo usará toda a memória disponível e trava. Por exemplo, em Coq, ReyCharles dá o exemplo de
Compute 70000.
, o que faz com que o verificador de tipo construa um numeral Peano gigante e trate.Em idiomas mais comuns que oferecem suporte a algum tipo de expansão macro ou metaprogramação, você pode fazer algo semelhante. Por exemplo, você pode usar toda a memória disponível em C:
A linguagem de programação D permite a execução de funções em tempo de compilação . Isso pode ser usado para calcular algo em tempo de compilação muito grande para caber na memória. Algo semelhante pode ser alcançado usando a metaprogramação de modelos C ++.
Em XML (não uma linguagem de programação compilada, mas um processador XML é análogo a um compilador), as entidades em expansão podem fazer com que o processador fique sem memória:
Isso é chamado de ataque de bilhões de risos .
fonte
<lolz>&lol999;</lolz>
são 10 ^ 999 risos, não um bilhão. As referências vinculadas usam<lolz>&lol9;</lolz>
, que é na verdade um bilhão.C #
Encontrei isso em uma pergunta de stackoverflow :
O compilador eventualmente irá falhar.
O problema parece relacionado à inferência de tipo e / ou geração lambda combinada com a resolução de sobrecarga.
fonte
VBA
Que tal se você pode travar o IDE digitando o código?
em qualquer aplicativo do Microsoft Office, tente o seguinte:
ALT+ F11para acessar a janela do VBA, tente o seguinte código
e eis:
Você pode simplesmente digitar
redim preserve v(,1 to 5)
na janela imediata e ela falhará depois que você pressionar ENTER!fonte
,
e esperada,
)Perl (15)
Isso cria um loop infinito no tempo de compilação :
(de perlmod )
E é por isso que o Perl não consegue concluir a análise do código. Isso não termina:
fonte
J
Isso segmenta o interpretador J (pelo menos no Linux):
Ele tenta ler do endereço de memória 2. Curiosamente, se você tentar com 0 ou 1, você consegue
domain error
.fonte
TeX
TeX é uma linguagem de macroexpansão. Aqui, definimos a expansão da macro
\x
para ser\x
novamente e, depois, adicionamos uma invocação de\x
. TeX fica preso indefinidamente substituindo\x
com\x
.fonte
Esquema
Meu compilador, Chicken, cometeu o erro de tentar expandir macros em tempo de compilação para "desempenho em tempo de execução" ou algo assim. Então pagou o preço de expandir este. Eu li o R5RS. Ninguém disse que as macros tinham que ser expandidas em tempo de compilação.
Essencialmente, o que está acontecendo é que a macro se expande para uma expressão de tamanho infinito, constantemente dobrando de tamanho. Bem, para ser técnico, dobrando todas as outras expansões. O destino do compilador está selado. Pelo menos no meu sistema, o Chicken caps de 2GB fica parado por um longo tempo tentando coletar lixo e depois trava depois que o coletor de lixo desiste. Demora um pouco, por causa de toda a mágica higiênica computacionalmente dispendiosa que ocorre.
Alternando entre expressões do formulário
e
parece aumentar drasticamente a taxa de consumo de memória em comparação com:
Suspeito que Chicken seja um compilador bastante resistente que tem algumas maneiras de evitar uma análise profunda de expressões sintáticas quando ele pode se safar, mas minha solução final obriga o pesquisador de padrões a realmente mergulhar.
fonte
@wizzwizz4
.Lisp comum
As macros facilitam:
compile-me
Chamadas de compilaçãoloop-forever
, que esgotam a memória da pilha durante sua expansão e travam o compilador. Se você quiser apenas fazer o compilador travar indefinidamente, então esta definiçãoloop-forever
fará:Isso deve funcionar usando qualquer implementação de CL, a menos que o seu seja extremamente inteligente e possa detectar loops infinitos simples, mas duvido seriamente que faça isso. A proteção total contra isso é impossível, é claro.
fonte
(defmacro loop-forever () (loop)) (defun compile-me () (loop-forever))
deve ser suficiente. Trava CCL para mim.PHP 5.3.1 (interpretador Segfaults) ( Bug 50261 , corrigido em 5.3.3)
Esse foi um problema, porque o código acima era comum em grande parte do código com o qual eu estava trabalhando, tornando esse um problema bastante difundido para nós.
(Se bem me lembro, em um ponto, essa foi a única maneira de chamar construtores-pai em PHP.)
fonte
D
(Compilador DMD32 D v2.067.1, compilação do Windows)
Observe que isso enviará o compilador para um loop infinito e o travará.
O snail mecânico sugeriu que os recursos de programação em tempo de compilação em D poderiam ser abusados para esse fim, mas a solução é talvez mais simples do que o tipo de técnicas que ele tinha em mente.
Para aqueles que não estão familiarizados com 'mixins de strings', é um recurso macro bastante simples. Quando o compilador encontra
mixin("asdf")
, ele o substitui pelo conteúdo da stringasdf
e tenta compilá-lo novamente.A solução acima será expandida como:
Portanto, a menos que o compilador tente detectar esse caso de expansão para o mesmo, ele entrará em um loop infinito de expansão.
fonte
Perl
Isso define a sobrecarga do operador no momento da compilação e executa o código no momento da compilação, que adiciona as instâncias da classe.
(a propósito, a recursão normalmente infinita consumiria toda a memória, mas com sobrecarga, ela trava)
Resultado:
fonte
Simplex v.0.5 , 2 bytes
Pena que este não é um código de golfe :
Deixe-me explicar. Dos documentos:
Assim:
O programa externo é um pequeno recurso interessante no Simplex: é avaliado no final do programa. Então, se acompanharmos ...:
Eventualmente, a memória acabará e o mundo terminará.
fonte
Clang ++
Acabei de encontrar esse bug divertido.
O objetivo é traduzir o Brainfuck em C, usando a meta-programação de modelos para fazer a maior parte do trabalho. Esse código funciona para programas menores do Brainfuck, como o Hello World, mas quando tentei executá-lo com 99 garrafas ...
Ele será compilado com êxito no GCC (após cerca de 2 minutos), mas vinculá-lo causa outro problema ...
Opa
fonte
Smalltalk (Squeak dialect, versão 4.x)
Muito fácil, basta avaliar isso ou aceitar um método com esse literal
Ele tentará avaliar a potência de 10 na aritmética de número inteiro grande, apenas para arredondar corretamente inf Tsss;)
Edit: quantos 9 são necessários?
Como 2 ^ 10 é 1024, aproximadamente 10 ^ 3, podemos aproximar aproximadamente 10 ^ n por 2 ^ (10 * n / 3). Isso significa que 10 ^ n exige que 10 * n / 3 bits sejam representados em binário. Gostaríamos de ter 10 ^ n não representável.
Assumindo ponteiros de 32 bits para a memória do objeto, sabemos que não podemos endereçar mais de 2 ^ 32 bytes, ou seja, 2 ^ 35 bits. Então, vamos reverter o problema: 2 ^ 35 é aproximadamente 32 * 2 ^ 30, 32 * 10 ^ 9. Isso requer cerca de 11 dígitos decimais; portanto, com onze 9, temos a certeza de gerar um erro no Squeak de 32 bits. Em 64 bits, isso seria vinte e um 9.
Também podemos esgotar a memória com menos 9s, todo o espaço endereçável não está necessariamente disponível, mas é mortalmente lento para testar, a Squeak VM não é otimizada para uma aritmética gigante diferente da GMP.
fonte
9
s?Este é o meu método original e conciso para travar o GolfScript:
O que isso faz é configurar um loop para sempre que continua pressionando 1 na pilha até a memória acabar.
Em C / C ++, acredito que esse trecho de código original travaria o compilador:
Isso faria com que o compilador travasse dobrando a quantidade de a e transformando-os em b e vice-versa, de modo que o compilador logo ficaria sem memória e travaria.
Outro é para lote no Windows, se congelar completamente o computador, em vez de apenas o próprio script em lote contar. Você deve digitar o seguinte:
Isso entra em um ciclo infinito de fazer cópias de si mesmo, que fazem cópias de si mesmos e assim por diante. Provavelmente, isso poderia eventualmente travar seu computador se você executasse esse pequeno código.
Um último é uma bomba VBS. É outra bomba, como a última, mas abre uma quantidade infinita de caixas de diálogo.
Isso cria continuamente uma cópia de si mesmo e abre uma caixa de mensagem em um loop infinito, o que os clones também fazem. A execução desses dois últimos programas não é recomendada, pois eles podem congelar o computador e fazer com que você precise inicializar com força o computador.
Observe que eu mesmo criei todos esses programas.
fonte
Lisp comum, 8 bytes
Mais curto que a outra resposta do Common Lisp :-)
Faça um loop enquanto lê seu formulário.
O padrão Common Lisp não menciona uma maneira portátil de fazê-lo falhar, então acho que precisamos ter uma maneira definida pela implementação. Ainda 8 bytes:
... ou
Quando você liga
(compile-file "crash.lisp")
, os ambientes misteriosamente "travam".Brincadeiras à parte, ainda estou tentando encontrar uma maneira de realmente danificar o ambiente (e em breve), mas é realmente difícil. Tudo o que recebo é uma boa interação com o depurador.
fonte
x86 asm
"nasm -v" retorna "NASM versão 2.11.08 compilada em 21 de fevereiro de 2015" (estou executando-o no win7)
O montador está rodando há 1:12:27 até agora em um i7, saturando totalmente um dos núcleos. O arquivo de saída está sentado em 0 bytes, o consumo de memória está estável em 1.004K - parece seguro dizer que eu acabei com tudo, em vez de apenas dar a ele uma tarefa muito, muito longa. :)
A chave do truque é o valor de repetição na macro - 0xFFFFFFFF. No entanto, eu não estou familiarizado o suficiente com os internos de Nasm para saber por que exatamente isso está sufocando. Eu esperava obter uma saída de ~ 16 GB há uma hora.
EDIT: Apenas verifiquei o gerenciador de tarefas, o Nasm está em execução há 7:40:41 e a memória está agora em 1.016K
fonte
Assembler Gnu, gerando enormes arquivos de saída
Essa macro tenta preencher o arquivo de saída com lixo (geralmente bytes nulos) até que um limite de 4 GB seja atingido, adiciona um int para ultrapassar esse limite e se chama recursivamente para continuar preenchendo a saída com pedaços de lixo de 4 GB. Isso encherá seu disco rígido até que esteja cheio; nesse ponto, o montador provavelmente travará.
Observe que a recursão infinita não pode ser usada, pois o assembler captura esse caso especial e para de expandir a macro.
A compilação pode ser feita
as -o crash.out crash.s
na maioria das distribuições Linux.fonte
Lisp comum, 29 bytes
Implementação: Clozure CL
AVISO: Tenha cuidado ao executar esse código, pois isso pode matar os processos que você não deseja!
Isso executa o comando shell
pkill cl
no tempo de compilação, o que matará o processo Lisp fazendo a compilação. Tecnicamente, não é um acidente, mas tem o mesmo efeito.Exemplo de uso:
fonte
Felix
Isso não funciona mais, mas em um ponto, este código:
Isso daria um grande erro:
FALHA DO SISTEMA bind_expression 'raise Not_found [BUG] Compilação Felix "/ media / ryan / stuff / felix / build / release / host / bin / flxg" "-q" "--optimise" "--inline = 100" "- output_dir = / home / ryan / stuff / .felix / text "" --cache_dir = / home / ryan / stuff / .felix / cache "" -I / mídia / ryan / stuff / felix / build / release / compartilhamento / lib "" -I / media / ryan / stuff / felix / build / release / host / lib "" --syntax=@/media/ryan/stuff/felix/build/release/share/lib/grammar/grammar.files " "--automaton = / home / ryan / stuff / .felix / cache / mídia / ryan / stuff / felix / build / release / share / lib / gramática / grammar.files / syntax.automaton" "--import = plat / flx.flxh "" std "" /home/ryan/golf/itri/sl.flx "falhou Erro 1 na flx: [strerror_r] Falha ao localizar texto para o erro número 1
A questão estava aqui:
let
esperava uma expressão para segui-lo, mas eu coloquei uma declaração. Então o compilador assustou um pouco.Mais informações em https://groups.google.com/forum/m/#!topic/felix-language/J3Hs4j6E0gM .
fonte
Javascript
Isso o envia para um loop infinito. Eu usei o compilador Codecademy JS e ele travou o meu navegador.
fonte
while(1){}
; este também é um loop infinito.while(1);
.Javascript
Este trava os navegadores da web de uma maneira seriamente eficaz. USE POR SUA CONTA E RISCO!!!
fonte
Hássio
Arquivo1.tem:
Arquivo2.tem:
Isso faz com que o Hassium carregue e comece a compilar o File2.has, que instrui o carregamento do File1.has, o que faz com que o File2.has seja carregado, e assim por diante.
fonte
LOLCODE 1.2, Intérprete / Compilador Comum LOLCODE (lci)
Eu sei que isso não é código-golfe, mas é extremamente curto de qualquer maneira.
Isso faz com que o sinal 11:
Por quê?
HAI1.2
indica o início do programa eOBTW
inicia um comentário multilinha. Mas o compilador espera queKTHXBYE
a feche oHAI
eTLDR
a feche o comentário multilinha.Observe que isso ainda funcionará para causar segfault com algo diferente de
TLDR
depoisOBTW
.(Pelos padrões da wikipedia , LOLCODE é apenas um estranho, não é realmente esotérico.)
Você pode pegar o intérprete em git / justinmeza / lci .
fonte