รหัสสั้นที่สุดที่จะทำให้เกิดการล้นสแต็คคืออะไร? [ปิด]


160

เพื่อเป็นการระลึกถึงการเปิดตัวสแต็คโอเวอร์โฟลว์สาธารณะรหัสที่สั้นที่สุดในการทำให้สแต็คโอเวอร์โฟลว์คืออะไร ยินดีต้อนรับทุกภาษา

การทางพิเศษแห่งประเทศไทย: เพียงเพื่อให้ชัดเจนในคำถามนี้เห็นว่าฉันเป็นผู้ใช้โครงการเป็นครั้งคราว: หางเรียก "เรียกซ้ำ" คือการทำซ้ำจริงๆและวิธีการแก้ปัญหาใด ๆ ที่สามารถแปลงเป็นโซลูชั่นซ้ำค่อนข้างโดยคอมไพเลอร์ที่ดี ถูกนับ :-P

ETA2: ตอนนี้ฉันเลือก“ คำตอบที่ดีที่สุด” แล้ว ดูโพสต์นี้เพื่อเหตุผล ขอบคุณทุกคนที่มีส่วนร่วม! :-)

คำตอบ:


212

คำตอบเหล่านี้ทั้งหมดและไม่มี Befunge? ฉันจะเดิมพันในจำนวนที่พอเหมาะซึ่งเป็นวิธีแก้ปัญหาที่สั้นที่สุดของพวกเขาทั้งหมด:

1

ไม่ได้ล้อเล่น. ลองด้วยตัวคุณเอง: http://www.quirkster.com/iano/js/befunge.html

แก้ไข: ฉันเดาว่าฉันต้องอธิบายเรื่องนี้ 1 ตัวถูกดำเนินการผลัก 1 ลงบนสแต็กภายในของ Befunge และการขาดสิ่งอื่นทำให้มันอยู่ในการวนซ้ำภายใต้กฎของภาษา

ด้วยการใช้ล่ามที่มีให้คุณจะได้ในที่สุดและฉันหมายถึงในที่สุด -จุดที่อาร์เรย์ Javascript ที่แสดงถึง Befunge stack จะใหญ่เกินไปสำหรับเบราว์เซอร์ที่จะจัดสรรใหม่ หากคุณมีล่าม Befunge ง่าย ๆ ที่มีสแต็กขนาดเล็กและล้อมรอบ - เช่นเดียวกับกรณีของภาษาส่วนใหญ่ด้านล่าง - โปรแกรมนี้จะทำให้เกิดการโอเวอร์โฟลว์ที่สังเกตเห็นได้เร็วขึ้น


8
อืม… แต่นี่เป็นกองล้นจริงๆหรือเป็นเพียงวงวนไม่สิ้นสุด? ล่าม JS ของฉันไม่ล้นมันเพิ่งไปเที่ยวเพื่อพูด
Konrad Rudolph

3
มันไม่ใช่ลูปไม่สิ้นสุดเนื่องจากคำสั่ง 1 ผลัก 1 ลงบนสแต็ก ในที่สุดล่าม Befunge ของคุณจะหมดพื้นที่สแต็ก แต่ใช้เวลาสักครู่ :)
Patrick

18
คุณ .. เบราว์เซอร์ของฉันพังและส่งแฟน CPU ของฉันไปที่พิกัดมากเกินไป
Sam152

2
! ที่น่าตื่นตาตื่นใจ คอมพิวเตอร์หรือเบราว์เซอร์ของฉัน (Opera) ไม่ได้ผิดพลาด แต่ประมวลผลทั้งสองกำลังทำงานบน 100% และความเร็วของพัดลมที่ 3
Secko

28
นี่คือโปรแกรม Befunge ที่โอเวอร์" โหลดเร็วกว่า: มันโหลด 79 สำเนาของหมายเลข 32 ทุก ๆ สองครั้งที่มันล้อมรอบแทนที่จะเป็น 2 สำเนาของหมายเลข 1
KirarinSnow

291

อ่านบรรทัดนี้และทำในสิ่งที่มันบอกว่าเป็นครั้งที่สอง


174

คุณสามารถลองใน C # .net

throw new StackOverflowException();

29
คนอวดรู้ในตัวฉันบอกว่ามันไม่ทำให้กองซ้อนล้น แต่ก็มีข้อยกเว้น นั่นคือการพูดว่าวิธีที่เร็วที่สุดที่จะถูกฉลามโจมตีคือการยืนในทะเลและกรีดร้องว่า "ฉลามจู่โจม!" อย่างไรก็ตามเรื่องนี้ฉันจะลงคะแนนให้ :)
เบอร์นาร์ด

ดี - มีความแตกต่าง? คุณสามารถจับมันและทำต่อไปได้หรือไม่? หรือเป็นเหมือน stackoverflow ใน c # หรือไม่ ในกรณีที่มันอย่างใดเป็น StackOverflow เพราะมันจะแยกไม่ออกจากที่หนึ่ง ... แต่ - upvote ด้วยเหตุผลทั้งหมดข้างต้น
โม

18
หากสแต็คล้นในป่าที่ไม่มีใครจับได้มันจะเป็นข้อยกเว้นหรือไม่?

ฉันจะไม่พูดว่า 'สั้นที่สุด' เพราะมันไม่เหมือนกับที่คุณรวบรวมคอมไพล์แบบเดียวได้ มันจะโยนสแต็คล้นอย่างรวดเร็วแม้ว่าฉันเดา
โดมินิค K


119

ปัจจุบันที่ดีที่สุดของฉัน (ในการชุมนุม x86) คือ:

push eax
jmp short $-1

ซึ่งส่งผลให้เป็นรหัสวัตถุ 3 ไบต์ ( 50 EB FD) สำหรับรหัส 16 บิตสิ่งนี้อาจเป็นไปได้ด้วย:

call $

ซึ่งส่งผลให้ 3 ไบต์ ( E8 FD FF)


6
การนับจำนวนไบต์หลังจาก "การคอมไพล์" (หรือการประกอบ) ไม่ใช่โค้ดกอล์ฟ
Louis บรั่นดี

37
คำถามบอกว่า "[... ] รหัสที่สั้นที่สุดที่ทำให้เกิดการโอเวอร์โฟลว์คืออะไร" ไม่ได้ระบุซอร์สโค้ดโค้ดที่แปลรหัสเครื่องรหัสออบเจ็กต์หรือรหัสที่ได้รับการจัดการ ...
Anders Sandvig

สำหรับเร็กคอร์ดเซิร์ฟเวอร์กอล์ฟของ Shin ช่วยให้คุณสามารถส่งรหัสวัตถุเพื่อตัดสินแม้ว่ามันจะนับส่วนหัวของเอลฟ์ทั้งหมดของคุณด้วย อืม ....
Chris Jester-Young

ดูตัวอย่างgolf.shinh.org/p.rb?FizzBuzz#x86สำหรับตัวอย่างนี้ (จริงๆแล้วฉันไม่รู้ว่าผู้คนสามารถสร้างไบนารีเอลฟ์ 99 ไบต์ได้อย่างไร) :-P
Chris Jester-Young

7
@lbrandy: มีคนมากพอที่สามารถเขียนรหัสวัตถุโดยตรง ฉันไม่สามารถทำได้สำหรับ x86 แต่สำหรับไมโครโปรเซสเซอร์บางตัวฉันทำได้ ฉันจะนับรหัสเช่นนั้น
Joey

113

PIC18

PIC18 คำตอบที่ได้รับจากการเรียนรู้ TKผลลัพธ์ในคำแนะนำดังต่อไปนี้ (binary):

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 รอบคำสั่งต่อวง ที่ 4 รอบนาฬิกาต่อรอบการสอนคุณมี 8 รอบรอบ PIC18 มีสแต็กระดับ 31 ดังนั้นหลังจากวน 32 ครั้งมันจะล้นสแต็คในรอบนาฬิกา 256 ที่ 64MHz คุณจะล้นสแต็คใน 4 วินาทีไมโครและ 2 ไบต์

PIC16F5x (ยิ่งเล็กและเร็วกว่า)

อย่างไรก็ตามซีรีย์ PIC16F5x ใช้คำสั่ง 12 บิต:

CALL $
1001 0000 0000

อีกรอบสองคำแนะนำต่อวง 4 นาฬิกาต่อคำสั่งดังนั้น 8 รอบนาฬิกาต่อวง

อย่างไรก็ตาม PIC16F5x มีสแต็กสองระดับดังนั้นในลูปที่สามมันจะล้นใน 24 คำแนะนำ ที่ 20MHz ก็จะล้นใน 1.2 วินาทีและ 1.5 ไมโครไบต์

Intel 4004

Intel 4004มีการเรียนการสอนโทร subroutine 8 บิต:

CALL $
0101 0000

สำหรับผู้อยากรู้อยากเห็นที่สอดคล้องกับ ascii 'P' กับสแต็คระดับ 3 ที่ใช้เวลา 24 รอบนาฬิการวมเป็น32.4 วินาทีและไมโครหนึ่งไบต์ (เว้นแต่คุณจะโอเวอร์คล็อก 4004 ของคุณ - มาเลยคุณรู้ว่าคุณต้องการ)

ซึ่งมีขนาดเล็กเท่ากับคำตอบ befunge แต่เร็วกว่าโค้ด befunge มากที่ทำงานในล่ามปัจจุบัน




55

ทุกงานต้องการเครื่องมือที่เหมาะสม พบกับภาษาSO Overflowซึ่งได้รับการปรับปรุงเพื่อสร้างสแต็คโอเวอร์โฟลว์

so

7
หากคุณกำลังสร้างภาษาพิเศษสำหรับการสร้างโอเวอร์โฟลว์ด้วยโค้ดน้อยที่สุดแน่นอนว่าคุณต้องการ (1) อินพุตเปล่าสร้างโค้ดล้นสแต็ก (อาจเป็นไบนารีขนาดเล็กที่รันโค้ดเนทีฟที่สร้างจากรายการรหัสแอสเซมบลี) หรือ (2) ) โปรแกรมอินพุตทั้งหมดสร้างไบนารีดังกล่าว
Jared Updike

อืมไม่ทัวริงเสร็จสมบูรณ์ ผมไม่ทราบว่าถ้าคุณสามารถเรียกมันว่าภาษาเพียง แต่ ...
อดัมเดวิส

42

เท็กซ์:

\def~{~.}~

ผลลัพธ์ใน:

! เกินความจุของ TeX ขออภัย [ขนาดสแต็กอินพุต = 5000]
~ -> ~
    .
~ -> ~
    .
~ -> ~
    .
~ -> ~
    .
~ -> ~
    .
~ -> ~
    .
...
<*> \ def ~ {~.} ~

น้ำยาง:

\end\end

ผลลัพธ์ใน:

! เกินความจุของ TeX ขออภัย [ขนาดสแต็กอินพุต = 5000]
\ end # 1 -> \ csname end # 1
                      \ endcsname \ @checkend {# 1} \ expandafter \ endgroup \ if @ e ...
<*> \ end \ end

นับตั้งแต่มีการใช้งานก็สามารถนำมาใช้ในสถานที่ของ~ \aและฉันค้นพบรหัส LaTeX โดยไม่ตั้งใจ :)
Josh Lee

35

แอสเซมเบลอร์ Z-80 - ที่ตำแหน่งหน่วยความจำ 0x0000:

rst 00

one byte - 0xC7 - วนซ้ำไม่สิ้นสุดของการผลักดันพีซีปัจจุบันไปยังสแต็กและกระโดดไปยังที่อยู่ 0x0000


2
ฉันจำ eprom ที่ว่างเปล่าได้ทั้งหมด 0xffs ซึ่งเป็นคำสั่ง rst 7 (= call 0x0038) ซึ่งจะมีประโยชน์สำหรับการดีบักฮาร์ดแวร์ของคุณด้วยออสซิลโลสโคป แอดเดรสบัสจะวนไปตามพื้นที่ 64K เนื่องจากสแต็กล้นซ้ำ ๆ สลับกับการอ่าน 0xff จาก 0x0038
Bill Forster

29

เป็นภาษาอังกฤษ:

recursion = n. See recursion.

32
สมองมนุษย์ที่มีเหตุผลใด ๆ ก็จะสามารถทำการตีความได้ดีเช่นกันและจะไม่ระเบิด :-P
Chris Jester-Young

73
วันนี้คริสสมองที่มีเหตุผลของมนุษย์กลายเป็นสิ่งหายาก
Jason Z

20
หายาก ... คุณหมายถึงพวกมันมีอยู่จริงเหรอ?
Adam Lerman

11
การเรียกซ้ำของ Google
CodeFusionMobile

29

อีกตัวอย่าง PHP:

<?
require(__FILE__);

4
คุณสามารถย่อให้สั้นได้ด้วยการข้ามวงเล็บ (แต่รวมช่องว่างไว้ก่อน)
alex

26

วิธีการเกี่ยวกับสิ่งต่อไปนี้ในภาษาเบสิก:

10 GOSUB 10

(ฉันไม่มีล่ามพื้นฐานฉันเกรงว่าจะเป็นการเดา)


3
ไม่ใช่สแต็คล้นมากเกินไปเนื่องจาก BASIC เป็นภาษาที่ไม่ใช้สแต็ก แม้แต่ VB (ซึ่งมีสแต็ก) จะไม่ล้นเพราะมันเพิ่งกระโดดไม่สร้างเฟรมสแต็ก
Daniel Spiewak

21
นั่นคือไม่ได้GOSUB GOTOเนื่องจากมันRETURNอยู่ที่ที่ถูกเรียกใช้แน่นอนว่าใช้กองซ้อนหรือไม่
ทอม

3
ใช่ฉันเห็นด้วย ผมมีหลายล้นสแต็คในขั้นพื้นฐานในยุค 80
nickd

6
ฉันขับรถคันนี้เป็นยาบาซิสเพื่อความสนุกและเกือบจะเอาคอมพิวเตอร์ของฉันไป ขอบคุณพระเจ้า malloc ในที่สุดก็ล้มเหลว แต่ฉันก็ไม่เพจในวันพรุ่งนี้
Adam Rosenfield

2
อ๊ะขอโทษอดัม ... ทำให้ฉันนึกถึงเวลาที่คนคนหนึ่งเมื่อมีคนเขียนโปรแกรมที่วนซ้ำโดยบังเอิญ: เอาเซิร์ฟเวอร์ซิลิคอนกราฟิกทั้งหมดลง
stusmith

26

ฉันชอบคำตอบของโคดี้ดังนั้นนี่คือผลงานที่คล้ายกันของฉันใน C ++:

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

typedef Overflow<0>::type Kaboom;

ไม่ใช่รายการรหัสกอล์ฟโดยวิธีการใด ๆ แต่ก็ยังมีอะไรให้เมตาโฟลว์ล้น! :-P


21

นี่คือผลงาน C ของฉันซึ่งมีน้ำหนัก 18 ตัว:

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

นี้เป็นจำนวนมากยากที่จะเพิ่มประสิทธิภาพหาง-Call! :-P


4
ไม่ได้รวบรวมสำหรับฉัน: "อ้างอิงไม่ได้กำหนดเพื่อ` main '": P
Andrew Johnson

1
ฉันไม่เข้าใจ: เหตุใดจึงเรียก o () 2x
Dinah

3
@Dinah: หนึ่งในข้อ จำกัด ของการแข่งขันของฉันคือการเพิ่มประสิทธิภาพการโทรหางไม่นับเป็นการเรียกซ้ำ มันเป็นแค่วนซ้ำ หากคุณเขียน o () เพียงครั้งเดียวนั่นก็เป็นการโทรหางที่ได้รับการปรับให้เหมาะกับบางสิ่งเช่นนี้ (โดยคอมไพเลอร์ที่เชี่ยวชาญ): "o: jmp o" ด้วย 2 การเรียก o, คอมไพเลอร์ต้องใช้สิ่งที่ต้องการ: "o: call o; jmp o" มันเป็นคำสั่ง "เรียก" ซ้ำซึ่งทำให้กองล้น
Chris Jester-Young

คุณถูกต้อง - ฉันไม่ได้ใส่ใจกับส่วนนั้น ขอบคุณสำหรับการชี้แจง
ไดน่า


17

จาวาสคริ

หากต้องการตัดตัวละครออกไปอีกสองสามตัวและเพื่อกำจัดตัวเองออกจากร้านค้าซอฟแวร์มากขึ้นไปด้วย:

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

15

Groovy:

main()

$ groovy stack.groovy:

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

โหวตเพราะมันน่าสนใจทีเดียว แสดงถึงจุดอ่อนที่ค่อนข้างน่ารำคาญในคอมไพเลอร์ Groovy แม้ว่า (การโทรแบบหางสามารถอินไลน์ได้ในเวลาคอมไพล์)
Daniel Spiewak

คุณแน่ใจหรือว่ามันเป็นการโทรหาง? ที่ล้มลงในตอนท้ายของโปรแกรมไม่ได้เรียกเปลือกล่าม?
แอรอน

15

โปรดบอกฉันว่าตัวย่อ " GNU " ย่อมาจากอะไร


4
หรือ Eine (Eine ไม่ใช่ Emacs) หรือ Zwei (Zwei เดิมคือ Eine) :-P
Chris Jester-Young

หรือ YAML หรือไวน์หรือ XNA หรือส่วนที่เหลือใด ๆ ที่en.wikipedia.org/wiki/Recursive_acronym
TM

Drei (Drei คือจริงๆ Emacs ไม่ระบุตัวตน) Fier (Fier เป็นนวัตกรรมใหม่แห่ง Emacs) - ok ดังนั้นฉันเพิ่งสร้างขึ้นเหล่านั้น :-)
Ferruccio

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

หวังว่าจะไม่มีการเรียกซ้ำแบบหางเลย!


1
เฮ้ตลกดี ที่เกี่ยวข้องกับการสนทนาแนวคิดของ "เอฟเฟกต์เสียงสะท้อนในห้อง" ก็น่าสนใจเช่นกัน ไม่สแต็คล้นมากเกินไป แต่ยังคง
Chris Jester-Young

8
นี่จะไม่ใช่ข้อยกเว้นตัวชี้โมฆะใช่หรือไม่ ขออภัยฉันรู้ว่ามันเป็นเรื่องตลก
jamesh

12

C - ไม่ใช่สั้นที่สุด แต่ไม่มีการเรียกซ้ำ มันไม่ใช่แบบพกพา: มันล้มเหลวบน Solaris แต่การใช้งาน alloca () บางอย่างอาจส่งคืนข้อผิดพลาดที่นี่ (หรือโทร malloc ()) จำเป็นต้องเรียกใช้ 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;
}

นอกจากนี้คุณยังสามารถทำ "ulimit -s16" เพื่อตั้งค่าสแต็กเล็ก ๆ ได้ ใด ๆ ที่เล็กกว่าประมาณ 16 และโปรแกรมก็ไม่ได้รันเลย (เห็นได้ชัดว่ามีเนื้อหาไม่เพียงพอ!)
Andrew Johnson

11

Perl ใน 12 ตัวอักษร:

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

ทุบตีใน 10 ตัวอักษร (พื้นที่ในฟังก์ชั่นเป็นสิ่งสำคัญ):

i(){ i;};i

11

ลองและวางมากกว่า 4 ไส้บนเบอร์เกอร์เดียว ล้นล้น


1
ที่นี่ในนิวซีแลนด์เรามีเบอร์เกอร์วิสคอนซินซึ่งใช้ไส้ใหญ่ แต่บาง ฉันแน่ใจว่าคุณสามารถสแต็คมากกว่า 4 รายการหากคุณต้องการ มันจะเป็นเบอร์เกอร์ที่แพงมาก!
Chris Jester-Young

อาจจะ: alafista.com/2010/05/10/…อาจจะไม่: cheaplightning.blogspot.com/2010/06/…
BCS


11

งูหลาม :

so=lambda:so();so()

อีกวิธีหนึ่งคือ:

def so():so()
so()

และถ้า Python ปรับหางให้เหมาะสมจะเรียก ... :

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

โชคดีสำหรับคุณ Python ไม่ได้ทำการปรับให้เหมาะสมแบบหางเรียก มิฉะนั้นจะถูกตัดสิทธิ์เช่นเดียวกับอีกสองคำตอบ :-P
Chris Jester-Young

10

ฉันกำลังเลือก "คำตอบที่ดีที่สุด" หลังจากโพสต์นี้ แต่ก่อนอื่นฉันต้องการรับทราบการมีส่วนร่วมที่เป็นต้นฉบับ:

  1. คนของ aku แต่ละคนสำรวจวิธีการใหม่และเป็นต้นฉบับที่ทำให้เกิดการล้นสแต็ค แนวคิดของการทำ f (x) ⇒ f (f (x)) คือสิ่งที่ฉันจะสำรวจในรายการถัดไปของฉันด้านล่าง :-)
  2. โคดี้คือคอมไพเลอร์ที่ทำให้ Nemerle คอมไพล์โอเวอร์โฟลว์
  3. และ (เล็กน้อยไม่น่าพอใจ) หนึ่งใน GateKiller เกี่ยวกับการโยนข้อยกเว้นสแต็คล้น :-P

เท่าที่ฉันชอบข้างต้นความท้าทายเกี่ยวกับการทำรหัสกอล์ฟและเพื่อความเป็นธรรมกับผู้ตอบแบบสอบถามฉันต้องให้รางวัล“ คำตอบที่ดีที่สุด” สำหรับรหัสสั้นที่สุดซึ่งเป็นรายการ Befunge; ฉันไม่เชื่อว่าทุกคนจะสามารถเอาชนะได้ (ถึงแม้ว่าคอนราดจะพยายามอย่างแน่นอน) ดังนั้นขอแสดงความยินดีกับแพทริค!

เมื่อเห็นการแก้ปัญหาสแต็ค - โอเวอร์ - บาย - เคอร์ชั่นจำนวนมากฉันประหลาดใจที่ไม่มีใครมี (จากการเขียนในปัจจุบัน) ได้นำ combinator Y ขึ้นมา (ดูเรียงความของ Dick Gabriel, The Why of Yสำหรับไพรเมอร์) ฉันมีโซลูชันแบบเรียกซ้ำที่ใช้ Y combinator รวมถึงวิธี f (f (x)) ของ aku :-)

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

8

นี่คืออีกหนึ่งที่น่าสนใจจากโครงการ:

((แลมบ์ดา (x) (xx)) (แลมบ์ดา (x) (xx)))

ดีมากและก็มีความสมมาตรเช่นกัน นอกจากนี้หากต้องการใช้สูตร (lambda (x) (xx)): ((Y (lambda (x) (xx))) #f) ก็สนุกเช่นกัน!
Chris Jester-Young

โอ้นั่นช่างน่ารัก มันใช้งานได้ใน Ruby เช่นกันแม้ว่าจะไม่สวยเหมือนใน Scheme: lambda {| x | x.call x} .call lambda {| x | x.call x}
Wayne Conrad

7

ชวา

โซลูชัน Java รุ่นที่สั้นกว่าเล็กน้อย

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

5
หรือ (หมายเลขเดียวกันของตัวอักษร): คงที่สาธารณะเป็นโมฆะหลัก (String ... ก) {หลัก ();}
ไมเคิลไมเออร์

หรือสำหรับพวก TDD (จำนวนตัวอักษรเดียวกัน): public class ${@org.junit.Test public void $ () {$ ();}}
mhaller

ยังไม่ถึงแม้ว่าจะสั้นที่สุด (ดูคำตอบของฉัน)
Draemon


5

3 ไบต์:

label:
  pusha
  jmp label

ปรับปรุง

ตามเอกสาร (เก่า) ของ Intel (?)นี่เป็น 3 ไบต์ด้วย:

label:
  call label


มันคือ 3 ไบต์ในโหมด 32 บิต คำตอบที่ดีเมื่อพิจารณาว่ามันจะเติมสแต็คเร็วกว่าคำตอบของฉันมาก!
Chris Jester-Young

ตามpenguin.cz/~literakl/intel/j.html#JMP , jmpคือ 3 ไบต์ด้วย 8, 16 หรือ 32 บิตที่อยู่ปลายทางที่เกี่ยวข้อง พุชต้านั้นมีขนาด 1 ไบต์ซึ่งรวมเป็น 4
Anders Sandvig

jmp มีสามประเภทสั้น ๆ ใกล้และไกล jmp แบบสั้น (โดยใช้ 0xEB opcode) คือสองไบต์ ปลายทางต้องอยู่ระหว่าง -128 ถึง 127 ไบต์จากคำสั่งถัดไป :-)
Chris Jester-Young

บางทีคุณพูดถูก ฉันขี้เกียจเกินกว่าที่จะขุดแอสเซมบลีของฉันและตรวจสอบ ... ;)
Anders Sandvig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.