Pour commémorer le lancement public de Stack Overflow, quel est le code le plus court pour provoquer un débordement de pile? N'importe quelle langue est la bienvenue.
ETA: Juste pour être clair sur cette question, étant donné que je suis un utilisateur occasionnel de Scheme: la "récursion" d'appel est vraiment une itération, et toute solution qui peut être convertie en solution itérative relativement trivialement par un compilateur décent ne le sera pas Être compté. :-P
ETA2: J'ai maintenant sélectionné une "meilleure réponse"; voir ce post pour la justification. Merci à tous ceux qui ont contribué! :-)
Actionscript 3: Tout est fait avec des tableaux ...
var i=[];
i[i.Push(i)]=i;
trace(i);
Peut-être pas le plus petit mais je pense que c'est mignon. Surtout la méthode Push qui renvoie la nouvelle longueur du tableau!
OCaml
let rec f l = f l@l;;
Celui-ci est un peu différent. Il n'y a qu'un seul cadre de pile sur la pile (car c'est la queue récursive), mais son entrée continue de croître jusqu'à ce qu'elle déborde de la pile. Appelez simplement f
avec une liste non vide comme celle-ci (à l'invite de l'interpréteur):
# f [0];;
Stack overflow during evaluation (looping recursion?).
int main(void) { return main(); }
main(){
main();
}
Plain and Nice C. me semble assez intuitif.
VB.Net
Function StackOverflow() As Integer
Return StackOverflow()
End Function
Pas très court, mais efficace! (JavaScript)
setTimeout(1, function() {while(1) a=1;});
eval(t="eval(t)")
t="Execute(t)":Execute(t)
Pour le plaisir, j'ai dû rechercher l'assemblage du Motorola HC11:
org $100
Loop nop
jsr Loop
Un autre fichier Windows Batch:
:a
@call :a
Problème de méta en D:
class C(int i) { C!(i+1) c; }
C!(1) c;
compiler le dépassement de la pile de temps
Haskell:
main = print $ x 1 where x y = x y + 1
Ruby (encore):
def a(x);x.gsub(/./){a$0};end;a"x"
Il y a déjà beaucoup de solutions Ruby mais je pensais que je jetterais une expression rationnelle pour faire bonne mesure.
_asm t: call t;
Ruby, quoique pas si court:
class Overflow
def initialize
Overflow.new
end
end
Overflow.new
Même s'il n'a pas vraiment de pile ...
brainf * ck 5 car
+[>+]
Python:
import sys
sys.setrecursionlimit(sys.maxint)
def so():
so()
so()
Je pense que c'est de la triche que je n'ai jamais joué auparavant;) mais voilà
Assembleur 8086:
org Int3VectorAdrress; est-ce de la triche?
int 3
1 octet - ou 5 caractères qui génèrent du code, qu'en dites-vous?
Dans l'assemblage x86, placez une instruction de division par 0 à l'emplacement en mémoire du gestionnaire d'interruption pour la division par 0!
pourquoi pas
mov sp,0
(la pile grandit)
L'optimisation des appels de queue peut être sabotée en évitant les appels de queue. En LISP commun:
(défun f () (1+ (f)))
Z80 Langage d'assemblage ...
.org 1000
loop: call loop
cela génère 3 octets de code à l'emplacement 1000 ....
1000 CD 00 10
real n(0)
n(1)=0
end
ou
call main
end
Le deuxième cas dépend du compilateur; pour GNU Fortran, il devra être compilé avec -fno-underscoring
.
(Les deux nombres incluent les nouvelles lignes requises)
Dyalog APL
fib←{
⍵∊0 1:⍵
+/∇¨⍵-1 2
}
Prolog
Ce programme plante à la fois SWI-Prolog et Sicstus Prolog lorsqu'il est consulté.
p :- p, q.
:- p.
En C #, cela créerait un stackoverflow ...
static void Main()
{
Main();
}
Dans un fichier PostScript appelé so.ps provoquera execstackoverflow
%!PS
/increase {1 add} def
1 increase
(so.ps) run