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

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

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