web-dev-qa-db-fra.com

Quel est le code le plus court pour provoquer un débordement de pile?

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é! :-)

160
Chris Jester-Young

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!

0
defmeta

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?).
0
Graphics Noob
int main(void) { return main(); }
0
Daniel Băluţă
main(){
   main();
}

Plain and Nice C. me semble assez intuitif.

0
N 1.1

VB.Net

Function StackOverflow() As Integer
    Return StackOverflow()
End Function
0
Kibbee

Pas très court, mais efficace! (JavaScript)

setTimeout(1, function() {while(1) a=1;});
0
Thevs

JavaScript (17 octets)

eval(t="eval(t)")

Script VB (25 octets)

t="Execute(t)":Execute(t)
0
st0le

Pour le plaisir, j'ai dû rechercher l'assemblage du Motorola HC11:

              org           $100
Loop    nop
          jsr            Loop
0
PersistenceOfVision

Un autre fichier Windows Batch:

:a
@call :a
0
Carlos Gutiérrez

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

0
BCS

Haskell:

main = print $ x 1 where x y = x y + 1
0
jkramer

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.

0
finnw
_asm t: call t;
0

Ruby, quoique pas si court:

class Overflow
    def initialize
        Overflow.new
    end
end

Overflow.new
0
RFelix

Même s'il n'a pas vraiment de pile ...

brainf * ck 5 car

+[>+]
0
Graphics Noob

Python:

import sys  
sys.setrecursionlimit(sys.maxint)  
def so():  
    so()  
so()
0
Artur Gaspar

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?

0
Despatcher

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!

0
Dennis Ferron

pourquoi pas

mov sp,0

(la pile grandit)

0
mike511

L'optimisation des appels de queue peut être sabotée en évitant les appels de queue. En LISP commun:

(défun f () (1+ (f)))
0
Svante

Z80 Langage d'assemblage ...

.org 1000
loop: call loop

cela génère 3 octets de code à l'emplacement 1000 ....

1000 CD 00 10

0
Tim Ring

Fortran, 13 et 20 caractères

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)

0
F'x

Dyalog APL

fib←{
    ⍵∊0 1:⍵
    +/∇¨⍵-1 2
}
0
wash

Prolog

Ce programme plante à la fois SWI-Prolog et Sicstus Prolog lorsqu'il est consulté.

p :- p, q.
:- p.
0
Kaarel

En C #, cela créerait un stackoverflow ...

static void Main()
{
    Main();
}
0
user11039

Dans un fichier PostScript appelé so.ps provoquera execstackoverflow

%!PS
/increase {1 add} def
1 increase
(so.ps) run
0
Mark Nold