Jaki jest najkrótszy kod powodujący przepełnienie stosu? [zamknięte]

Obecnie pytanie to nie pasuje do naszego formatu pytań i odpowiedzi. Oczekujemy, że odpowiedzi będą poparte faktami, referencjami lub wiedzą specjalistyczną, ale to pytanie będzie prawdopodobnie wywoływało debatę, argumenty, ankiety lub rozszerzoną dyskusję. Jeśli uważasz, że to pytanie można poprawić i ewentualnie ponownie otworzyć, odwiedź Pomoc centrum dla wskazówek. Zamknięty 9 lat temu . zamknięte. To pytanie i jego odpowiedzi są zamknięte , ponieważ pytanie jest off-topic, ale ma znaczenie historyczne. Obecnie nie przyjmuje nowych odpowiedzi ani interakcji.

Aby upamiętnić publiczne uruchomienie Stack Overflow, jaki jest najkrótszy kod, aby spowodować przepełnienie stosu? Każdy język mile widziany.

ETA: tak dla jasności, ponieważ jestem sporadycznym użytkownikiem schematów: tail-call "recursion" jest naprawdę iteracją, a każde rozwiązanie, które może być przekonwertowane na rozwiązanie iteracyjne stosunkowo trywialnie przez porządny kompilator, nie będzie liczone. :- P

ETA2: Teraz wybrałem "najlepszą odpowiedź"; zobacz ten post dla uzasadnienia. Dziękujemy wszystkim, którzy przyczynili się do tego! :-)

Author: Chris Jester-Young, 2008-09-15

30 answers

Wszystkie te odpowiedzi i żadnego Befunge ' a? Założę się, że to najkrótsze rozwiązanie z nich wszystkich:

1
Nie żartuję. Spróbuj sam: http://www.quirkster.com/iano/js/befunge.html

EDIT: chyba muszę to wyjaśnić. Operand 1 wypycha 1 na wewnętrzny stos Befunge, a brak czegokolwiek innego powoduje, że jest on zapętlony zgodnie z regułami języka.

Używając dostarczonego tłumacza, w końcu ... i mam na myśli W końcu ... uderzysz punkt, w którym tablica Javascript reprezentująca stos Befunge staje się zbyt duża, aby przeglądarka mogła się ponownie przydzielić. Gdybyś miał prosty interpreter Befunge z mniejszym i ograniczonym stosem-jak to ma miejsce w przypadku większości poniższych języków-ten program spowodowałby szybsze zauważalne przepełnienie.

 212
Author: Patrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 23:07:42

Przeczytaj ten wiersz i zrób to, co mówi dwa razy .

 291
Author: jrudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 16:16:56

Możesz też spróbować tego w C#.net

throw new StackOverflowException();
 174
Author: GateKiller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 11:53:38

Nemerle :

To rozbija kompilator ze Stoskoverflowexception:

def o(){[o()]}
 159
Author: Cody Brocious,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 19:46:46

Mój obecny najlepszy (w x86 assembly) to:

push eax
jmp short $-1

, co daje 3 bajty kodu obiektowego (50 EB FD). Dla kodu 16-bitowego jest to również możliwe:

call $

, co daje również 3 bajty (E8 FD FF).

 119
Author: Chris Jester-Young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 11:17:47

PIC18

Odpowiedź PIC18 udzielona przez TK daje następujące instrukcje (binarne):

overflow
   PUSH
   0000 0000 0000 0101
   CALL overflow
   1110 1100 0000 0000
   0000 0000 0000 0000

Jednak samo wywołanie wykona przepełnienie stosu:

CALL $
1110 1100 0000 0000
0000 0000 0000 0000

Mniejszy, szybszy PIC18

Ale rcall (względne wywołanie) jest nadal mniejszy (Nie pamięć globalna, więc nie potrzeba dodatkowych 2 bajtów):

RCALL $
1101 1000 0000 0000

Tak więc najmniejsza na PIC18 jest pojedynczą instrukcją, 16 bitów (dwa bajty). Zajęłoby to 2 cykle instrukcji na pętlę. Przy 4 cyklach zegara na cykl instrukcji masz 8 cykli zegara. PIC18 ma stos 31 poziomów, więc po 32 pętli przepełni stos, w 256 cyklach zegara. Przy 64MHz, można by przepełnić stos w 4 mikro sekund i 2 bajty.

PIC16F5x (jeszcze mniejszy i szybszy) Jednak seria PIC16F5x używa 12-bitowych instrukcji:
CALL $
1001 0000 0000

Ponownie, dwa cykle instrukcji na pętlę, 4 zegary na instrukcję, więc 8 cykli zegara na pętlę.

[[7]}jednak PIC16F5x ma dwupoziomowy stos, więc na trzeciej pętli przepełni się, w 24 instrukcjach. W 20MHz przepełnia się w 1.2 mikro sekund i 1.5 bajtów .

Intel 4004

Intel 4004 ma 8-bitową instrukcję podprogramu wywołania:

CALL $
0101 0000

Dla ciekawskich, które odpowiadają ASCII 'P'. Ze stosem 3 poziomów, który zajmuje 24 cykle zegara w sumie 32,4 mikro sekund i jeden bajt. (Chyba, że podkręcasz swój 4004-daj spokój, wiesz, że chcesz za.)

Który jest tak mały jak odpowiedź befunge, ale dużo, dużo szybszy niż kod befunge działający w obecnych interpreterach.

 113
Author: Adam Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:10

C#:

public int Foo { get { return Foo; } }
 77
Author: aku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 18:24:56

Hoot overflow!

//              v___v
let rec f o = f(o);(o)
//             ['---']
//             -"---"-
 57
Author: Juliet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-21 12:59:38

Każde zadanie wymaga odpowiedniego narzędzia. Poznaj język so Overflow , zoptymalizowany do tworzenia przepełnień stosu:

so
 55
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 08:36:39

TeX:

\def~{~.}~

Wyniki w:

! TeX capacity exceeded, sorry [input stack size=5000].
~->~
    .
~->~
    .
~->~
    .
~->~
    .
~->~
    .
~->~
    .
...
<*> \def~{~.}~

LaTeX:

\end\end

Wyniki w:

! TeX capacity exceeded, sorry [input stack size=5000].
\end #1->\csname end#1
                      \endcsname \@checkend {#1}\expandafter \endgroup \if@e...
<*> \end\end
 42
Author: Pi.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-24 15:00:51

Asembler Z-80 -- W Miejscu Pamięci 0x0000:

rst 00

Jeden bajt -- 0xc7 -- niekończąca się pętla przesuwania bieżącego komputera do stosu i przeskakiwania na adres 0x0000.

 35
Author: Dennis Munsie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 17:00:09

W języku angielskim:

recursion = n. See recursion.
 29
Author: Vinko Vrsalovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 11:39:32

Kolejny przykład PHP:

<?
require(__FILE__);
 29
Author: disq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-24 21:28:21

A może w BASIC:

10 GOSUB 10

(obawiam się, że nie mam podstawowego tłumacza, więc to zgadywanka).

 26
Author: stusmith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 12:24:45

Spodobała mi się odpowiedź Cody ' ego, więc oto mój podobny wkład, w C++:

template <int i>
class Overflow {
    typedef typename Overflow<i + 1>::type type;
};

typedef Overflow<0>::type Kaboom;

W żaden sposób nie jest to wpis kodu golfowego, ale nadal wszystko dla przepełnienia stosu meta! :- P

 26
Author: Chris Jester-Young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 12:33:25

Oto mój wkład C, ważący 18 znaków:

void o(){o();o();}

To jest lot trudniejszy do zoptymalizowania! :- P

 21
Author: Chris Jester-Young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 11:46:48

Użycie pliku wsadowego okna o nazwie "S. bat":

call s
 19
Author: Jude Allred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 02:48:14

Javascript

Aby przyciąć jeszcze kilka znaków i dać się wykopać z kolejnych sklepów z oprogramowaniem, zacznijmy od:

eval(i='eval(i)');
 17
Author: Travis Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-23 20:00:59

Groovy:

main()

$ groovy stack.groovy: {]}

Caught: java.lang.StackOverflowError
    at stack.main(stack.groovy)
    at stack.run(stack.groovy:1)
 ...
 15
Author: Chris Broadfoot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 16:24:08

Proszę mi powiedzieć, co oznacza skrót" GNU ".

 15
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 19:09:50
Person JeffAtwood;
Person JoelSpolsky;
JeffAtwood.TalkTo(JoelSpolsky);

Mamy nadzieję, że nie będzie rekurencji ogonowej!

 14
Author: Ryan Fox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 02:38:59

C - nie jest najkrótsza, ale jest wolna od rekurencji. Nie jest też przenośna: wywala się na Solarisie, ale niektóre implementacje alloca () mogą zwrócić tutaj błąd (lub wywołać malloc ()). Konieczne jest wywołanie printf ().

#include <stdio.h>
#include <alloca.h>
#include <sys/resource.h>
int main(int argc, char *argv[]) {
    struct rlimit rl = {0};
    getrlimit(RLIMIT_STACK, &rl);
    (void) alloca(rl.rlim_cur);
    printf("Goodbye, world\n");
    return 0;
}
 12
Author: bk1e,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 15:14:11

Perl w 12 znakach:

$_=sub{&$_};&$_

Bash w 10 znakach (spacja w funkcji jest ważna):

i(){ i;};i
 11
Author: asksol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 12:45:21

Spróbuj umieścić więcej niż 4 paszteciki na jednym hamburgerze. przepełnienie stosu.

 11
Author: user8456,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 16:18:11

Python :

so=lambda:so();so()

Alternatywnie:

def so():so()
so()

I jeśli Python zoptymalizował wywołania ogonowe...:

o=lambda:map(o,o());o()
 11
Author: Cody Brocious,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-28 01:18:49

Wybieram "najlepszą odpowiedź" po tym poście. Ale najpierw chciałbym pochwalić się bardzo oryginalnym wkładem:

    / Align = "left" / Każdy z nich bada nowy i oryginalny sposób powodowania przepełnienia stosu. Pomysł robienia f (x) ⇒ F (f(x)) to ten, który poznam w następnym wpisie, poniżej. :-)
  1. Cody dał kompilatorowi Nemerle przepełnienie stosu.
  2. i (trochę niechętnie), GateKiller jest o rzucaniu wyjątku przepełnienia stosu. :- P

Bardzo podoba mi się powyższe, wyzwanie polega na zrobieniu code golfa, i aby być uczciwym wobec respondentów, muszę przyznać "najlepszą odpowiedź" najkrótszemu kodowi, czyli wpisowi Befunge; nie wierzę, że ktoś będzie w stanie to pokonać( chociaż Konrad na pewno próbował), więc gratulacje Patrick!

Widząc dużą liczbę rozwiązań przepełnienia stosu przez rekursję, dziwię się, że nikt (w obecnym piśmie) nie wspomniał o kombinatorze Y (patrz esej Dicka Gabriela, dlaczego Y , dla podkładu). Mam rozwiązanie rekurencyjne, które wykorzystuje kombinator Y, a także podejście aku f(f(x)). :-)

((Y (lambda (f) (lambda (x) (f (f x))))) #f)
 10
Author: Chris Jester-Young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 13:17:29

Oto kolejny ciekawy ze Scheme:

((lambda (x) (x x)) (lambda (x) (x x)))
 8
Author: Adam Rosenfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 19:26:26

Java

Nieco krótsza wersja rozwiązania Java.

class X{public static void main(String[]a){main(a);}}
 7
Author: Misha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 14:41:42
xor esp, esp
ret
 6
Author: a1k0n,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 15:20:22

3 bajty: {[0]}

Update

Według The (old?) Intel(?) dokumentacja , to również 3 bajty:

{[1]}

 5
Author: Anders Sandvig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 13:30:10