Ecrivez un code parfaitement légal dans un langage correct de votre choix, dont la compilation plantera le compilateur ou l'enverra dans une boucle infinie (temps de compilation infini).
Restrictions
- Utilisez un langage standard utilisé dans le monde réel.
- Utilisez un compilateur standard bien développé (pas de réponses du type "j’ai écrit mon compilateur C qui plante tout").
- Le code doit être légal dans la langue (vous devrez donc probablement exploiter un compilateur ou un bogue de langue).
- Indiquez la version de votre compilateur et les options utilisées afin que d'autres puissent la répliquer.
- Expliquez pourquoi le compilateur s'est écrasé, si possible.
S'amuser :)
popularity-contest
compile-time
Petr Pudlák
la source
la source
Réponses:
Je suis presque sûr que cela a été corrigé maintenant, mais vous aviez l'habitude de faire planter le compilateur Java (ou de planter Eclipse) en écrivant
http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
En fait, selon cette page, le compilateur se bloquera et ne plantera pas. Pourtant, je pensais que c'était assez amusant.
la source
Ma solution préférée pour GHC:
Pour GHC 6.12.1 à la fois
ghci Bad.hs
et laghc Bad.hs
boucle à l' infini. GHC 7.4.1 boucle infiniment quandghc -O2 Bad.hs
est exécuté.Explication:
omega
est défini en utilisant une récursion infinie (la seule façon pour elle d’habiter n’importe quel type). L'inliner du compilateur est perçuxx
comme une fonction simple et non récursive. Il essaie donc de l'inclure dans la définition deomega
. Il en résulte(\x@(C x') -> x' x) (C xx)
. En voyant une correspondance de motif sur un constructeur, le compilateur tente de le réduire, en récupérantxx (C xx)
et en boucle. Le truc, c’est qu’ilxx
est effectivement récursif, mais la récursivité est masquée dans le type de données.Remarque: lors de l'écriture du puzzle, j'avais oublié que j'avais laissé GHC s'exécuter dans la boucle infinie. Il a fallu toute ma mémoire, Firefox s'est écrasé et j'ai à peine réussi à le tuer sans réinitialisation matérielle.
la source
Ceci est facile dans n'importe quel langage dépendant de la langue. Les types dépendants généraux de vérification de type sont indécidables car ils peuvent nécessiter des calculs arbitrairement complexes (Turing-complete). Vous pouvez simplement encoder dans un type dépendant une valeur trop grande. Ensuite, le vérificateur de type utilisera toute la mémoire disponible et plantera. Par exemple, dans Coq, ReyCharles donne l'exemple
Compute 70000.
, ce qui amène le vérificateur de type à construire un chiffre Peano géant et à provoquer un crash.Dans les langages plus courants qui prennent en charge une sorte d’expansion de macro ou de métaprogrammation, vous pouvez faire quelque chose de similaire. Par exemple, vous pouvez utiliser toute la mémoire disponible en C:
Le langage de programmation D permet l' exécution d'une fonction au moment de la compilation . Cela peut être utilisé pour calculer quelque chose au moment de la compilation qui est trop volumineux pour tenir en mémoire. Quelque chose de similaire peut être obtenu en utilisant la métaprogrammation de modèles C ++.
En XML (pas un langage de programmation compilé, mais un processeur XML est analogue à un compilateur), les entités en développement peuvent faire que le processeur manque de mémoire:
C'est ce qu'on appelle l' attaque d'un milliard de rires .
la source
<lolz>&lol999;</lolz>
c'est 10 ^ 999 rires, pas un milliard. Les références liées utilisent<lolz>&lol9;</lolz>
, qui est en réalité un milliard.C #
Trouvé ceci sur une question de stackoverflow :
Le compilateur finira par planter.
Le problème semble lié à l'inférence de type et / ou à la génération lambda, combinés à la résolution de surcharge.
la source
VBA
que diriez-vous si vous pouvez planter l'IDE en tapant du code?
Dans n'importe quelle application Microsoft Office, essayez ceci:
ALT+ F11pour accéder à la fenêtre VBA, puis essayez le code suivant
et voici:
Vous pouvez simplement taper
redim preserve v(,1 to 5)
dans la fenêtre immédiate, et il se plantera après avoir appuyé sur ENTER!la source
,
et attendu,
)Perl (15)
Cela crée une boucle infinie au moment de la compilation :
(de perlmod )
Et c'est pourquoi Perl n'est pas en mesure de terminer l'analyse du code. Cela ne se termine pas:
la source
J
Cela sépare l’interpréteur J (au moins sous Linux):
Il essaie de lire depuis l'adresse de mémoire 2. Fait intéressant, si vous essayez avec 0 ou 1, vous obtenez
domain error
.la source
Texas
TeX est un langage de macro-expansion. Nous définissons ici le développement de la macro
\x
comme étant à\x
nouveau, puis nous ajoutons ensuite une invocation de\x
. TeX se coince sans cesse remplacer\x
avec\x
.la source
Schème
Mon compilateur, Chicken, a fait l'erreur d'essayer de développer des macros au moment de la compilation pour des "performances d'exécution" ou quelque chose du genre. Donc, il a payé le prix de l'expansion de celui-ci. J'ai lu R5RS. Personne n'a dit que les macros devaient être développées au moment de la compilation.
En gros, ce qui se passe, c'est que la macro se développe en une expression de taille infinie, doublant constamment de taille. Eh bien, pour être technique, doubler chaque extension. Le destin du compilateur est scellé. Au moins sur mon système, les bouchons de poulet à 2 Go bloquent longtemps en essayant de ramasser les ordures, puis se bloquent après l'abandon du ramasse-miettes. Cela prend un certain temps, cependant, à cause de la magie hygiénique coûteuse en informatique.
Basculer entre les expressions de la forme
et
semble augmenter de façon très très importante le taux de consommation de mémoire par rapport à:
Je soupçonne que Chicken est un compilateur assez hardi qui a certains moyens d’éviter une analyse en profondeur des expressions syntaxiques quand il peut s’en tirer, mais ma solution finale force le modélisateur de patterns à vraiment plonger dedans.
la source
@wizzwizz4
.Common Lisp
Les macros rendent les choses faciles:
La compilation des
compile-me
appelsloop-forever
, qui épuise la mémoire de tas pendant son expansion et bloque le compilateur. Si vous voulez juste que le compilateur se bloque indéfiniment, alors cette définition de leloop-forever
fera:Cela devrait fonctionner avec n'importe quelle implémentation CL, à moins que le vôtre ne soit extrêmement intelligent et ne détecte de simples boucles infinies, mais je doute fort que cela se produise. Une protection complète contre cela est impossible, bien sûr.
la source
(defmacro loop-forever () (loop)) (defun compile-me () (loop-forever))
devrait être suffisant. Il accroche CCL pour moi.PHP 5.3.1 (interpréteur Segfaults) ( Bug 50261 , corrigé dans 5.3.3)
Celui-ci était un peu problématique, car le code ci-dessus était commun dans beaucoup de codes avec lesquels je travaillais, ce qui en fait un problème assez répandu pour nous.
(Si je me souviens bien, à un moment donné, c'était le seul moyen d'appeler les constructeurs parents en PHP.)
la source
ré
(Compilateur DMD32 D v2.067.1, version Windows)
Notez que cela enverra le compilateur dans une boucle infinie et le plantera.
Mechanical snail a suggéré que les fonctionnalités de programmation au moment de la compilation en D pourraient être utilisées à cette fin, mais la solution est peut-être plus simple que le type de technique qu'il avait en tête.
Pour ceux qui ne sont pas familiers avec 'string mixins', c'est une fonctionnalité macro assez simple. Lorsque le compilateur le rencontre
mixin("asdf")
, il le remplace par le contenu de la chaîneasdf
et tente de le recompiler.La solution ci-dessus sera étendue comme suit:
Donc, à moins que le compilateur ne détecte ce cas d'extension, il entrera dans une boucle d'expansion infinie.
la source
Perl
Ceci définit la surcharge des opérateurs lors de la compilation et exécute un code lors de la compilation qui ajoute les instances de la classe.
(à propos, normalement une récursion infinie mangerait toute la mémoire, mais avec une surcharge, ça plantait)
Sortie:
la source
Simplex v.0.5 , 2 octets
Dommage que ce ne soit pas un code-golf :
Laissez-moi expliquer. De la docs:
Alors:
Le programme externe est une petite fonctionnalité intéressante dans Simplex: il est évalué à la fin du programme. Donc, si nous gardons une trace ...:
Finalement, la mémoire s'épuise et le monde finira.
la source
Clang ++
Je viens de tomber sur ce bogue amusant.
L'objectif est de traduire Brainfuck en C, en utilisant la méta-programmation de modèles pour effectuer la majeure partie du travail. Ce code fonctionne pour les programmes Brainfuck plus petits, tels que Hello World, mais lorsque j'ai essayé de l'exécuter avec 99 bouteilles ...
Il sera compilé avec succès dans GCC (après environ 2 minutes), mais le lier provoque un autre problème ...
Oops.
la source
Smalltalk (dialecte Squeak, version 4.x)
Très facile, évaluez cela ou acceptez une méthode avec ce littéral
Il essaiera d'évaluer la puissance de 10 dans l'arithmétique de grand entier, juste pour arrondir correctement inf Tsss;)
Edit: combien de 9 sont nécessaires?
Puisque 2 ^ 10 est 1024, environ 10 ^ 3, on peut approximativement 10 ^ n sur 2 ^ (10 * n / 3). Cela signifie que 10 ^ n nécessitent que 10 * n / 3 bits soient représentés en binaire. Nous aimerions avoir 10 ^ n non représentable.
En supposant des pointeurs 32 bits pour la mémoire objet, nous savons que nous ne pouvons pas adresser plus de 2 ^ 32 octets, soit 2 ^ 35 bits. Donc inversons le problème: 2 ^ 35 est environ 32 * 2 ^ 30, 32 * 10 ^ 9. Cela nécessite environ 11 chiffres décimaux, donc avec onze 9, nous sommes sûrs de générer une erreur sur 32bits Squeak. En 64 bits, ce serait vingt et un 9.
Nous pouvons également épuiser la mémoire avec moins de 9 secondes. L'ensemble de l'espace adressable n'est pas nécessairement disponible, mais il est extrêmement lent à tester, la VM Squeak n'est pas optimisée pour une telle arithmétique géante contrairement à GMP.
la source
9
s?Voici ma méthode originale et concise pour planter GolfScript:
Cela permet de créer une boucle permanente qui continue d’appuyer 1 sur la pile jusqu’à épuisement de la mémoire.
En C / C ++, je pense que cet élément de code original planterait le compilateur:
Cela empêcherait le compilateur de doubler le nombre de a et de les transformer en b, et inversement, de sorte que le compilateur manquerait bientôt de mémoire et se planterait.
Une autre option concerne les traitements par lots sous Windows, si le blocage du traitement lui-même est pris en compte plutôt que par le traitement par lots Vous devriez taper ce qui suit:
Cela entre dans une boucle infinie de faire des copies de lui-même, qui se font des copies d’elles-mêmes, etc. Cela finirait très probablement par planter votre ordinateur si vous exécutiez ce petit morceau de code.
Un dernier est une bombe de VBS. C'est une autre bombe, comme la dernière, mais elle ouvre une quantité infinie de boîtes de dialogue.
Cela crée continuellement une copie de lui-même et ouvre une boîte de message dans une boucle infinie, ce que font également les clones. L'exécution de ces deux derniers programmes n'est pas recommandée, car ils peuvent geler votre ordinateur et vous obliger à le démarrer dur.
Notez que je suis venu avec tous ces programmes moi-même.
la source
Common Lisp, 8 octets
Plus courte que l'autre réponse Common Lisp :-)
Bouclez en lisant votre formulaire.
La norme Common Lisp ne mentionne pas de moyen portable de le faire planter, alors je suppose que nous devons avoir un moyen défini par l'implémentation. Encore 8 octets:
... ou,
Lorsque vous appelez
(compile-file "crash.lisp")
, les environnements se "plantent" mystérieusement.Blague à part, j'essaie toujours de trouver un moyen de vraiment écraser l'environnement (et bientôt), mais c'est vraiment difficile. Tout ce que je reçois est une bonne interaction avec le débogueur.
la source
x86 asm
"nasm -v" renvoie "NASM version 2.11.08 compilée le 21 février 2015" (je l'exécute sous win7)
L’assembleur a couru depuis 1:12:27 sur un i7, saturant totalement l’un des cœurs. Le fichier de sortie est assis à 0 octet, la consommation de mémoire est stable à 1 004 Ko - il semble raisonnable de dire que j'ai vaincu le nasme au lieu de simplement lui confier une très longue tâche. :)
La clé de l'astuce est la valeur de répétition dans la macro - 0xFFFFFFFF. Cependant, je ne connais pas suffisamment les internes de Nasm pour savoir pourquoi cela s’étouffe. Je m'attendais à obtenir une sortie de ~ 16 Go il y a une heure.
EDIT: Il suffit de vérifier le gestionnaire de tâches, Nasm fonctionne depuis 7h40:41 et la mémoire atteint maintenant 1 016K
la source
Assembleur Gnu, générant d' énormes fichiers de sortie
Cette macro tente de remplir le fichier de sortie avec garbage (octets généralement nuls) jusqu'à atteindre une limite de 4 Go, ajoute un int pour dépasser cette limite et s'appelle de manière récursive pour continuer à remplir la sortie avec des morceaux de 4 Go de garbage. Cela remplira votre disque dur jusqu’à ce qu’il soit plein, ce qui provoquera le crash de l’assembleur.
Notez que la récursion infinie ne peut pas être utilisée, car l'assembleur interceptera ce cas particulier et cessera de développer la macro.
La compilation peut être effectuée avec la
as -o crash.out crash.s
plupart des distributions Linux.la source
Common Lisp, 29 octets
Mise en oeuvre: Clozure CL
AVERTISSEMENT: soyez prudent lorsque vous exécutez ce code, il peut tuer des processus que vous ne souhaitez pas!
Ceci exécute la commande shell
pkill cl
lors de la compilation, ce qui va tuer le processus Lisp qui effectue la compilation. Pas techniquement un crash, mais cela a le même effet.Exemple d'utilisation:
la source
Félix
Cela ne fonctionne plus, mais à un moment donné, ce code:
Cela donnerait une grosse erreur:
ÉCHEC DE SYSTÈME bind_expression 'levée Not_found [BUG] Compilation de 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 / lib / grammar / grammar.files / syntax.automaton" "--import = plat / flx.flxh "" std "" /home/ryan/golf/itri/sl.flx "a échoué Erreur 1 dans flx: [strerror_r] Impossible de trouver le texte du numéro d'erreur 1
Le problème était ici:
let
attendu une expression à la suivre, mais je mets une déclaration à la place. Donc, le compilateur a paniqué un peu.Plus d'informations sur https://groups.google.com/forum/m/#!topic/felix-language/J3Hs4j6E0gM .
la source
JavaScript
Cela l'envoie dans une boucle infinie. J'ai utilisé le compilateur Codecademy JS et mon navigateur s'est bloqué.
la source
while(1){}
; c'est aussi une boucle infinie.while(1);
.Javascript
Celui-ci bloque les navigateurs Web de manière sérieusement efficace. À UTILISER À VOS RISQUES ET PÉRILS!!!
la source
Hassium
Fichier1.a:
Fichier2.a:
Hassium se charge alors et commence à compiler File2.has, ce qui lui dit de charger File1.has, ce qui le force à charger File2.has, etc.
la source
LOLCODE 1.2, interpréteur / compilateur commun LOLCODE (lci)
Je sais que ce n'est pas du code-golf mais de toute façon, il est extrêmement court.
Cela provoque le signal 11:
Pourquoi?
HAI1.2
indique le début du programme etOBTW
lance un commentaire multiligne. Mais le compilateur s'attendKTHXBYE
à ceHAI
queTLDR
les commentaires multilignes soient fermés et fermés.Notez que cela fonctionnera toujours pour causer un segfault avec autre chose
TLDR
qu'aprèsOBTW
.(Selon les normes de wikipedia , LOLCODE est juste un Weirdlang, pas réellement ésotérique.)
Vous pouvez récupérer l’interprète sur git / justinmeza / lci .
la source