Programing

스택 오버플로를 일으키는 가장 짧은 코드는 무엇입니까?

lottogame 2020. 6. 2. 21:19
반응형

스택 오버플로를 일으키는 가장 짧은 코드는 무엇입니까? [닫은]


스택 오버플로의 공개 출시를 기념하기 위해 스택 오버플로를 유발하는 가장 짧은 코드는 무엇입니까? 모든 언어를 환영합니다.

ETA :이 질문에 대해 명확하게하기 위해 가끔씩 Scheme 사용자 인 경우 : tail-call "recursion"은 실제로 반복이며, 적절한 컴파일러에 의해 비교적 간단한 반복 솔루션으로 변환 할 수있는 솔루션은 그렇지 않습니다. 계산됩니다. :-피

ETA2 : 저는 이제 "최고의 답변"을 선택했습니다. 근거 이 게시물참조하십시오 . 기여한 모든 분들께 감사드립니다! :-)


이 모든 대답과 Befunge는 없습니까? 나는 그들 모두의 가장 짧은 해결책 인 공정한 금액을 베팅했다.

1

농담 아니야. 직접 해보십시오 : http://www.quirkster.com/iano/js/befunge.html

편집 : 나는 이것을 설명해야한다고 생각합니다. 1 피연산자는 1을 Befunge의 내부 스택으로 푸시하고 다른 요소가 없으면 언어 규칙에 따라 루프에 넣습니다.

제공된 인터프리터를 사용하면 결국 Befunge 스택을 나타내는 Javascript 배열이 브라우저가 다시 할당하기에 너무 커지는 지점에 도달하게됩니다. 아래의 대부분의 언어에서와 같이 더 작고 제한된 스택을 가진 간단한 Befunge 인터프리터가있는 경우이 프로그램은 더 눈에 띄는 오버플로를 더 빨리 발생시킵니다.


이 줄을 읽고 두 번 말하는 것을하십시오 .


C # .net에서 시도해 볼 수도 있습니다.

throw new StackOverflowException();

Nemerle :

이로 인해 컴파일러 가 StackOverflowException과 충돌합니다 .

def o(){[o()]}

내 현재 최고 (x86 어셈블리)는 다음과 같습니다.

push eax
jmp short $-1

3 바이트의 객체 코드 ( 50 EB FD)가 생성됩니다. 16 비트 코드의 경우 다음도 가능합니다.

call $

또한 3 바이트 ( E8 FD FF)가됩니다.


PIC18

TK에 의해 주어진 PIC18 응답 다음 지시 사항 결과 (진) :

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

그러나 CALL만으로 스택 오버플로를 수행합니다.

CALL $
1110 1100 0000 0000
0000 0000 0000 0000

더 작고 빠른 PIC18

그러나 RCALL (상대 호출)은 여전히 ​​작습니다 (전역 메모리가 아니므로 추가 2 바이트가 필요하지 않음).

RCALL $
1101 1000 0000 0000

따라서 PIC18에서 가장 작은 것은 단일 명령, 16 비트 (2 바이트)입니다. 루프 당 2 개의 명령 사이클이 필요합니다. 명령 사이클 당 4 클럭 사이클에서 8 클럭 사이클이 있습니다. PIC18에는 31 레벨 스택이 있으므로 32 루프 후에 256 클록 사이클로 스택에 오버플로가 발생합니다. 64MHz에서는 스택을 4 마이크로 초와 2 바이트로 오버플로합니다 .

PIC16F5x (더 작고 빠름)

그러나 PIC16F5x 시리즈는 12 비트 명령어를 사용합니다.

CALL $
1001 0000 0000

다시 한 번, 루프 당 2 개의 명령 사이클, 명령 당 4 개의 클록, 따라서 루프 당 8 개의 클록 사이클.

그러나 PIC16F5x에는 2 단계 스택이 있으므로 세 번째 루프에서는 24 개의 명령으로 오버플로됩니다. 20MHz에서는 1.2 마이크로 초와 1.5 바이트로 오버플로됩니다 .

인텔 4004

인텔 4004는 8 비트 호출 서브 루틴 명령이 있습니다 :

CALL $
0101 0000

ascii 'P'에 해당하는 궁금합니다. 32.4 마이크로 초와 1 바이트에 24 클럭 사이클을 소요하는 3 레벨 스택 . (4004를 오버 클로킹하지 않는 한, 당신이 원하는 것을 알고 있습니다.)

어느 것이 befunge 답변만큼 작지만 현재 통역사에서 실행되는 befunge 코드보다 훨씬 빠릅니다.


씨#:

public int Foo { get { return Foo; } }

Hoot overflow!

//              v___v
let rec f o = f(o);(o)
//             ['---']
//             -"---"-

Every task needs the right tool. Meet the SO Overflow language, optimized to produce stack overflows:

so

TeX:

\def~{~.}~

Results in:

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

LaTeX:

\end\end

Results in:

! TeX capacity exceeded, sorry [input stack size=5000].
\end #1->\csname end#1
                      \endcsname \@checkend {#1}\expandafter \endgroup \if@e...
<*> \end\end

Z-80 assembler -- at memory location 0x0000:

rst 00

one byte -- 0xC7 -- endless loop of pushing the current PC to the stack and jumping to address 0x0000.


In english:

recursion = n. See recursion.

Another PHP Example:

<?
require(__FILE__);

How about the following in BASIC:

10 GOSUB 10

(I don't have a BASIC interpreter I'm afraid so that's a guess).


I loved Cody's answer heaps, so here is my similar contribution, in C++:

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

typedef Overflow<0>::type Kaboom;

Not a code golf entry by any means, but still, anything for a meta stack overflow! :-P


Here's my C contribution, weighing in at 18 characters:

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

This is a lot harder to tail-call optimise! :-P


Using a Window's batch file named "s.bat":

call s

Javascript

To trim a few more characters, and to get ourselves kicked out of more software shops, let's go with:

eval(i='eval(i)');

Groovy:

main()

$ groovy stack.groovy:

Caught: java.lang.StackOverflowError
    at stack.main(stack.groovy)
    at stack.run(stack.groovy:1)
 ...

Please tell me what the acronym "GNU" stands for.


Person JeffAtwood;
Person JoelSpolsky;
JeffAtwood.TalkTo(JoelSpolsky);

Here's hoping for no tail recursion!


C - It's not the shortest, but it's recursion-free. It's also not portable: it crashes on Solaris, but some alloca() implementations might return an error here (or call malloc()). The call to printf() is necessary.

#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;
}

perl in 12 chars:

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

bash in 10 chars (the space in the function is important):

i(){ i;};i

try and put more than 4 patties on a single burger. stack overflow.


Python:

so=lambda:so();so()

Alternatively:

def so():so()
so()

And if Python optimized tail calls...:

o=lambda:map(o,o());o()

I'm selecting the “best answer” after this post. But first, I'd like to acknowledge some very original contributions:

  1. aku's ones. Each one explores a new and original way of causing stack overflow. The idea of doing f(x) ⇒ f(f(x)) is one I'll explore in my next entry, below. :-)
  2. Cody's one that gave the Nemerle compiler a stack overflow.
  3. And (a bit grudgingly), GateKiller's one about throwing a stack overflow exception. :-P

Much as I love the above, the challenge is about doing code golf, and to be fair to respondents, I have to award “best answer” to the shortest code, which is the Befunge entry; I don't believe anybody will be able to beat that (although Konrad has certainly tried), so congrats Patrick!

Seeing the large number of stack-overflow-by-recursion solutions, I'm surprised that nobody has (as of current writing) brought up the Y combinator (see Dick Gabriel's essay, The Why of Y, for a primer). I have a recursive solution that uses the Y combinator, as well as aku's f(f(x)) approach. :-)

((Y (lambda (f) (lambda (x) (f (f x))))) #f)

Here's another interesting one from Scheme:

((lambda (x) (x x)) (lambda (x) (x x)))

Java

Slightly shorter version of the Java solution.

class X{public static void main(String[]a){main(a);}}

xor esp, esp
ret

3 bytes:


label:
  pusha
  jmp label

Update

According to the (old?) Intel(?) documentation, this is also 3 bytes:


label:
  call label

참고URL : https://stackoverflow.com/questions/62188/whats-the-shortest-code-to-cause-a-stack-overflow

반응형