Escriba un código perfectamente legal en un lenguaje decente de su elección cuya compilación bloqueará el compilador o lo enviará a un bucle infinito (tiempo de compilación infinito).
Restricciones
- Use un lenguaje estándar que se use en el mundo real.
- Use un compilador estándar y bien desarrollado (no hay respuestas como "Escribí mi compilador de C que falla en todo").
- El código debe ser legal en el idioma (lo más probable es que tenga que explotar un compilador o un error de idioma).
- Déle a su compilador la versión y las opciones utilizadas para que otros puedan replicarlo.
- Explica por qué el compilador se bloqueó, si es posible.
Que te diviertas :)
popularity-contest
compile-time
Petr Pudlák
fuente
fuente
Respuestas:
Estoy bastante seguro de que se ha solucionado ahora, pero solía ser que podía bloquear el compilador de Java (o, bloquear Eclipse) escribiendo
http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
En realidad, de acuerdo con esa página, el compilador simplemente se bloqueará, no se bloqueará. Aún así, pensé que era muy divertido.
fuente
Mi solución favorita para GHC:
Para GHC 6.12.1, ambos
ghci Bad.hs
yghc Bad.hs
bucle infinito. GHC 7.4.1 realiza un bucle infinito cuandoghc -O2 Bad.hs
se ejecuta.Explicación:
omega
se define utilizando una recursión infinita (la única forma en que puede habitar cualquier tipo). El compilador del compilador vexx
como una función simple, no recursiva, por lo que intenta incluirlo en la definición deomega
. El resultado es(\x@(C x') -> x' x) (C xx)
. Al ver una coincidencia de patrones en un constructor, el compilador intenta reducirlo, obteniendoxx (C xx)
nuevamente bucles. El truco es que enxx
realidad es recursivo, pero la recursión está oculta dentro del tipo de datos.Nota: Mientras escribía el rompecabezas, olvidé que dejé GHC ejecutándose en el bucle infinito. Tomó toda mi memoria, se estrelló Firefox y apenas logré matarlo sin restablecimiento completo.
fuente
Esto es fácil en cualquier lenguaje de tipo dependiente . La verificación de tipos de tipos dependientes generales es indecidible ya que puede requerir cálculos arbitrariamente complejos (Turing-complete). Simplemente puede codificar en un tipo dependiente un valor demasiado grande. Luego, el verificador de tipos utilizará toda la memoria disponible y se bloqueará. Por ejemplo, en Coq, ReyCharles da el ejemplo de
Compute 70000.
, lo que hace que el verificador de tipos construya un número gigante de Peano y se bloquee.En lenguajes más comunes que admiten algún tipo de macro expansión o metaprogramación, puede hacer algo similar. Por ejemplo, puede usar toda la memoria disponible en C:
El lenguaje de programación D permite la ejecución de funciones en tiempo de compilación . Esto se puede usar para calcular algo en tiempo de compilación que es demasiado grande para caber en la memoria. Algo similar se puede lograr usando la metaprogramación de plantillas C ++.
En XML (no es un lenguaje de programación compilado, pero un procesador XML es análogo a un compilador), las entidades en expansión pueden hacer que el procesador se quede sin memoria:
Esto se llama el ataque de mil millones de risas .
fuente
<lolz>&lol999;</lolz>
son 10 ^ 999 risas, no mil millones. Los usos de referencias vinculadas<lolz>&lol9;</lolz>
, que en realidad son mil millones.C#
Encontré esto en una pregunta de stackoverflow :
El compilador eventualmente se bloqueará.
El problema parece estar relacionado con la inferencia de tipos y / o la generación lambda combinada con la resolución de sobrecarga.
fuente
VBA
¿qué tal si puedes bloquear el IDE escribiendo código?
en cualquier aplicación de Microsoft Office, intente esto:
ALT+ F11para llegar a la ventana de VBA, luego intente el siguiente código
y he aquí
¡Simplemente puede escribir
redim preserve v(,1 to 5)
en la ventana inmediata y se bloqueará después de presionar ENTER!fuente
,
y esperado,
)Perl (15)
Esto crea un bucle infinito en tiempo de compilación :
(de perlmod )
Y es por eso que Perl no puede completar el análisis del código. Esto no termina:
fuente
J
Esto pone en peligro al intérprete J (al menos en Linux):
Intenta leer desde la dirección de memoria 2. Curiosamente, si lo intentas con 0 o 1, obtienes
domain error
.fuente
Texas
TeX es un lenguaje de macroexpansión. Aquí definimos la expansión de la macro
\x
para que sea\x
nuevamente, y luego agregamos luego una invocación de\x
. TeX se atasca interminablemente reemplazando\x
con\x
.fuente
Esquema
Mi compilador, Chicken, cometió el error de intentar expandir macros en tiempo de compilación para "rendimiento en tiempo de ejecución" o algo así. Entonces pagó el precio de expandir este. He leído R5RS. Nadie dijo que las macros debían expandirse en tiempo de compilación.
Esencialmente, lo que está sucediendo es que la macro se expande a una expresión de tamaño infinito, duplicando constantemente su tamaño. Bueno, para ser técnico, duplicar cualquier otra expansión. El destino del compilador está sellado. Al menos en mi sistema, Chicken caps a 2GB, se detiene durante mucho tiempo tratando de recolectar basura, luego se bloquea después de que el recolector de basura se rinde. Sin embargo, lleva un tiempo debido a toda la magia higiénica computacionalmente costosa que ocurre.
Cambiar entre expresiones de la forma
y
parece aumentar muy, muy dramáticamente la tasa de consumo de memoria en comparación con:
Sospecho que Chicken es un compilador bastante robusto que tiene algunas formas de evitar un análisis profundo de las expresiones sintácticas cuando puede salirse con la suya, pero mi solución final obliga al patrón de patrones a sumergirse realmente.
fuente
@wizzwizz4
.Lisp común
Las macros lo hacen fácil:
Compilar
compile-me
llamadasloop-forever
, que agota la memoria de almacenamiento dinámico durante su expansión y bloquea el compilador. Si solo desea que el compilador se cuelgue indefinidamente, entonces esta definición deloop-forever
lo hará:Esto debería funcionar con cualquier implementación de CL, a menos que la suya sea extremadamente inteligente y pueda detectar bucles infinitos simples, pero dudo seriamente que alguno haga esto. La protección total contra esto es imposible, por supuesto.
fuente
(defmacro loop-forever () (loop)) (defun compile-me () (loop-forever))
Debería ser suficiente. Cuelga CCL para mí.PHP 5.3.1 (intérprete de Segfaults) ( error 50261 , corregido en 5.3.3)
Este fue un pequeño problema, porque el código anterior era común en muchos de los códigos con los que estaba trabajando, por lo que este es un problema bastante extendido para nosotros.
(Si recuerdo correctamente, en un momento esta era la única forma de llamar a los constructores principales en PHP).
fuente
re
(Compilador DMD32 D v2.067.1, compilación de Windows)
Tenga en cuenta que esto enviará el compilador a un bucle infinito y lo bloqueará.
El caracol mecánico sugirió que las funciones de programación en tiempo de compilación en D podrían ser abusadas para este propósito, pero la solución es quizás más simple que el tipo de técnicas que tenía en mente.
Para aquellos que no están familiarizados con los 'mixins de cadenas', es una característica macro bastante sencilla. Cuando el compilador se encuentra
mixin("asdf")
, lo sustituye con el contenido de la cadenaasdf
e intenta compilarlo nuevamente.La solución anterior se expandirá como:
Entonces, a menos que el compilador intente detectar este caso de expandir a mismo, entrará en un bucle infinito de expansión.
fuente
Perl
Esto define la sobrecarga del operador en tiempo de compilación, y ejecuta código en tiempo de compilación que agrega las instancias de clase juntas.
(por cierto, normalmente la recursión infinita se comería toda la memoria, pero con una sobrecarga, simplemente se bloquea)
Salida:
fuente
Simplex v.0.5 , 2 bytes
Lástima que esto no sea un código de golf :
Dejame explicar. De los documentos:
Entonces:
El programa externo es una pequeña característica en Simplex: se evalúa al final del programa. Entonces, si hacemos un seguimiento ...:
Eventualmente, la memoria se acabará y el mundo terminará.
fuente
Clang ++
Acabo de encontrar este divertido insecto.
El objetivo es traducir Brainfuck a C, usando metaprogramación de plantillas para hacer la mayor parte del trabajo. Este código funciona para programas más pequeños de Brainfuck, como Hello World, pero cuando intenté ejecutarlo con 99 botellas ...
Se compilará correctamente en GCC (después de aproximadamente 2 minutos), pero vincularlo causa otro problema ...
Ups
fuente
Smalltalk (dialecto Squeak, versión 4.x)
Muy fácil, solo evalúa esto o acepta un método con este literal
Intentará evaluar la potencia de 10 en aritmética de enteros grandes, solo para redondear correctamente inf Tsss;)
Editar: ¿cuántos 9 son necesarios?
Como 2 ^ 10 es 1024, aproximadamente 10 ^ 3, podemos aproximar aproximadamente 10 ^ n por 2 ^ (10 * n / 3). Eso significa que 10 ^ n requieren 10 * n / 3 bits para representarse en binario. Nos gustaría tener 10 ^ n no representable.
Suponiendo punteros de 32 bits para la memoria del objeto, sabemos que no podemos direccionar más de 2 ^ 32 bytes, es decir 2 ^ 35 bits. Entonces, invirtamos el problema: 2 ^ 35 es aproximadamente 32 * 2 ^ 30, 32 * 10 ^ 9. Eso requiere aproximadamente 11 dígitos decimales, por lo que con once 9, estamos seguros de generar un error en Squeak de 32 bits. En 64 bits serían veintiuno 9.
También podemos agotar la memoria con menos 9 segundos, todo el espacio direccionable no está necesariamente disponible, pero es muy lento de probar, el Squeak VM no está optimizado para una aritmética tan gigante a diferencia de GMP.
fuente
9
s?Este es mi método original y conciso para bloquear GolfScript:
Lo que esto hace es configurar un bucle para siempre que sigue presionando 1 en la pila hasta que se agote la memoria.
En C / C ++, creo que este código original bloqueará el compilador:
Esto haría que el compilador se atascara duplicando la cantidad de a y convirtiéndolos en b y viceversa, por lo que el compilador pronto se quedará sin memoria y se bloqueará.
Otro es para lotes en Windows, si el congelamiento completo de la computadora en lugar de solo el script por lotes en sí mismo cuenta. Debe escribir lo siguiente:
Esto entra en un ciclo infinito de hacer copias de sí mismo, que hacen copias de sí mismos, etc. Esto probablemente bloqueará su computadora si ejecuta este pequeño código.
Una última es una bomba VBS. Es otra bomba, como la última, pero en su lugar abre una cantidad infinita de cuadros de diálogo.
Esto crea continuamente una copia de sí mismo y abre un cuadro de mensaje en un bucle infinito, lo que también hacen los clones. No se recomienda ejecutar estos dos últimos programas, ya que pueden congelar su computadora y hacer que tenga que arrancarla.
Tenga en cuenta que se me ocurrió todos estos programas yo mismo.
fuente
Lisp común, 8 bytes
Más corta que la otra respuesta de Common Lisp :-)
Bucle mientras lee su formulario.
El estándar Common Lisp no menciona una forma portátil de hacer que se bloquee, por lo que creo que necesitamos tener una forma definida por la implementación. Todavía 8 bytes:
... o
Cuando llamas
(compile-file "crash.lisp")
, los entornos misteriosamente "chocan".Bromeando, todavía estoy tratando de encontrar una manera de bloquear realmente el medio ambiente (y en breve), pero es realmente difícil. Todo lo que obtengo es una buena interacción con el depurador.
fuente
x86 asm
"nasm -v" devuelve "NASM versión 2.11.08 compilada el 21 de febrero de 2015" (lo estoy ejecutando en win7)
El ensamblador ha estado funcionando durante 1:12:27 hasta ahora en un i7, saturando totalmente uno de los núcleos. El archivo de salida se encuentra en 0 bytes, el consumo de memoria se ha mantenido estable en 1,004K, parece seguro decir que he superado a Nasm, en lugar de simplemente darle una tarea muy, muy larga. :)
La clave del truco es el valor de repetición en la macro: 0xFFFFFFFF. Sin embargo, no estoy lo suficientemente familiarizado con las partes internas de Nasm para saber por qué exactamente se está ahogando con esto. Esperaba obtener una salida de ~ 16 GB hace una hora.
EDITAR: acabo de comprobar el administrador de tareas, Nasm ha estado funcionando durante 7:40:41 y la memoria ahora es de hasta 1,016K
fuente
Ensamblador de GNU, generando grandes archivos de salida
Esta macro intenta llenar el archivo de salida con basura (generalmente bytes nulos) hasta que se alcanza un límite de 4 GB, agrega un int para superar ese límite y recursivamente se llama a sí mismo para seguir llenando la salida con trozos de basura de 4 GB. Esto llenará su disco duro hasta que esté lleno, momento en el cual el ensamblador probablemente se bloqueará.
Tenga en cuenta que no se puede utilizar la recursión infinita, ya que el ensamblador captará ese caso especial y dejará de expandir la macro.
La compilación se puede hacer con la
as -o crash.out crash.s
mayoría de las distribuciones de Linux.fuente
Lisp común, 29 bytes
Implementación: Clozure CL
ADVERTENCIA: ¡ Tenga cuidado al ejecutar este código, puede matar procesos que no desea!
Esto ejecuta el comando de shell
pkill cl
en tiempo de compilación, que matará el proceso Lisp que realiza la compilación. No es técnicamente un accidente, pero tiene el mismo efecto.Ejemplo de uso:
fuente
Felix
Esto ya no funciona, pero en un momento, este código:
Esto daría un gran error:
FALLO DEL SISTEMA bind_expression 'elevado Not_found [ERROR] Compilación 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 / media / ryan / stuff / felix / build / release / share / 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 / media / ryan / stuff / felix / build / release / share / lib / grammar / grammar.files / syntax.automaton" "--import = plat / flx.flxh "" std "" /home/ryan/golf/itri/sl.flx "falló Error 1 en flx: [strerror_r] Error al encontrar el texto para el error número 1
El problema estaba aquí:
let
esperaba que una expresión lo siguiera, pero puse una declaración en su lugar. Entonces el compilador se asustó un poco.Más información en https://groups.google.com/forum/m/#!topic/felix-language/J3Hs4j6E0gM .
fuente
JavaScript
Esto lo envía a un bucle infinito. Usé el compilador Codecademy JS y se bloqueó mi navegador.
fuente
while(1){}
; Esto también es un bucle infinito.while(1);
.Javascript
Este bloquea los navegadores web de una manera realmente efectiva. ¡¡¡ÚSELO BAJO SU PROPIO RIESGO!!!
fuente
Hassium
File1.has:
File2.has:
Esto hace que Hassium se cargue y comience a compilar File2.has, que le dice que cargue File1.has, lo que hace que cargue File2.has, y así sucesivamente.
fuente
LOLCODE 1.2, LOLCODE Intérprete / Compilador Común (lci)
Sé que esto no es código golf, pero de todos modos es extremadamente corto.
Esto causa la señal 11:
¿Por qué?
HAI1.2
denota el inicio del programa eOBTW
inicia un comentario multilínea. Pero el compilador espera queKTHXBYE
a cierre elHAI
, yTLDR
a que cierre el comentario multilínea.Tenga en cuenta que esto seguirá funcionando para causar una falla predeterminada con cualquier otra cosa que no sea
TLDR
despuésOBTW
.(Según los estándares de wikipedia , LOLCODE es solo un Weirdlang, en realidad no esotérico).
Puede obtener el intérprete de git / justinmeza / lci .
fuente