ถาม: เขียนชิ้นส่วนของรหัสที่ปิดตัวเอง [ปิด]


39

ฉันกำลังค้นหาชิ้นส่วนของรหัสที่หยุดทันที - ในแบบที่ไม่เป็นทางการ

นี่ไม่ได้หมายความว่า: System.exit((int) 'A');(Java)

มันอาจหมายถึง:

#!/usr/bin/env python3
# NOTE: This kills ALL RUNNING Python processes. Be careful!
def exit():
    import os
    os.system("killall python3")
    # Windows addon
    os.system("taskkill /im python.exe /f")
exit()

คำตอบที่โหวตมากที่สุดชนะ! ทุกภาษาสถาปัตยกรรมทั้งหมด

แก้ไข: การออกโดยการโยนข้อยกเว้นจะไม่ได้รับการยอมรับอีกต่อไป!


3
แต่นั่นไม่ใช่แหกคอกเพื่อยุติการประหารชีวิต ... มันเป็นทางเลือกexit()แต่ก็ยังเป็นคุณสมบัติที่นำมาใช้ ...
s3lph

13
นี่ไม่ใช่การหมุนรอบโค้ด - เรารู้ว่าเราต้องการคำตอบแปลก ๆ จากอันนี้
เลียมดอว์สัน

6
การปิดระบบทำงานหรือไม่
Hosch250

8
ฉันเคยทำให้การ์ดเครือข่ายไปยัง DMA โดยไม่ตั้งใจผ่านระบบปฏิบัติการ เมื่อมันเกิดขึ้นคุณจะกลับมาที่ BIOS ทันทีทำการรีบูท
เบ็คแจ็คสัน

3
ฉันรู้สึกว่าแชนนอนทำให้เราพ่ายแพ้ที่นี่;)
ดาวรุ่ง

คำตอบ:


44

bash, 6 ตัวอักษร

exec [

execแทนที่กระบวนการปัจจุบันด้วยสิ่งอื่น [เป็นคำสั่งที่สั้นที่สุดที่ฉันพบว่าไม่เป็นอันตราย (เป็นชื่อแทนtest)


ข้อยกเว้นอื่น ๆ ?
Johannes Kuhn

ไม่เพียงexec'ไอเอ็นจี[คำสั่ง :)
เดนนิส Kaarsemaker

1
มันทำงานทำไม [ทำอะไร
s3lph

@the_Seppi จะแทนที่กระบวนการปัจจุบันด้วย [(ทดสอบ aka)
Timtech

~ $ echo $PATH/?/bin/X /bin/[ /bin/w-> เปลือกปลาให้คำสั่งอีกสองข้อให้ฉัน wเป็นสิ่งที่น่าสนใจในความคิดของฉัน
Konrad Borowski

46

ทุบตี

echo "Turn off your computer or i'll wipe your harddrive..."
echo 3;sleep 1
echo 2;sleep 1
echo 1;sleep 1
dd if=/dev/random of=/dev/hda

ยุติโปรแกรมให้เร็วที่สุดเท่าที่ผู้ใช้สามารถตอบสนองได้ ;-)


10
Upvoting เพราะมันทำให้ฉันหัวเราะ
Michael Stern

5
ดีกว่าอย่ารันบน Linux
kenorb

1
dd: / dev / hda: ไม่พบ
Joshua

39

Redcode

(พื้นหลัง: Redcode ภาษาหลอกประกอบที่ใช้ในแกนสงครามการเขียนโปรแกรมเกมนำโดย AK กดิวด์ในปี 1984 ซึ่งโดยปกติจะทำให้การใช้งานหนักของรหัสตัวเองปรับเปลี่ยนผมเขียนมีความสุขเล็ก ๆ น้อย ๆ . กวดวิชาเกี่ยวกับการเขียนโปรแกรม Redcodeค่อนข้างไม่กี่ปีที่ผ่านมา )

MOV 1, 0

โปรแกรมการเรียนการสอนเดียวนี้ไม่เพียง แต่ฆ่าตัวเอง แต่ยังเช็ดรหัสโปรแกรมของตัวเองจากหน่วยความจำโดยไม่ทิ้งร่องรอยของตัวเองในหน่วยความจำ

คุณน่าเบื่อใช่มั้ย ท้ายที่สุดแล้วโปรแกรมข้างต้นก็ตายไปแล้วแม้ว่ามันจะไม่ได้เขียนทับรหัสของมันก็ตาม ตกลงนี่คือสิ่งที่ทำความสะอาดทั้งแกนก่อนที่จะเช็ดตัวเองและตายไป:

loop: MOV  ptr+1, >ptr 
      JMN  loop, loop
      SPL  1
      SPL  1
      MOV  ptr+1, >ptr
ptr:  DAT  0, 1

สองคำสั่งแรกทำงานจริง ๆ แล้วส่วนใหญ่: มันเป็นเพียงแค่ copy / jump loop ที่คัดลอกเซลล์คำสั่งเปล่า (ซึ่งถูกกำหนดค่าเริ่มต้นDAT 0, 0) หลังจากสิ้นสุดโปรแกรมไปยังทุกเซลล์ที่ตามมา (โดยใช้โหมดการกำหนดแอดเดรสทางอ้อมภายหลัง>) จนกว่าตัวชี้จะล้อมรอบไปจนถึงจุดเริ่มต้นของหน่วยความจำและเขียนทับMOVในลูปเอง หลังจากนั้นสิ่งที่เกิดขึ้นJMN(JuMp หากไม่ใช่ศูนย์) จะตรวจจับและตกหล่น

ปัญหาคือว่านี้ยังคงJMNปล่อยตัวเองไม่ได้ปลด ในการกำจัดมันเราต้องใช้อีกอันMOVเพื่อเช็ดJMN... แต่นั่นหมายความว่าเราต้องการอีกอันMOVในการเช็ดมัน MOVและอื่น ๆ ในการทำให้โปรแกรมทั้งหมดหายไปอย่างไร้ร่องรอยเราต้องจัดการMOVคำสั่งอย่างเดียวเพื่อล้างทั้งตัวเองและอย่างน้อยหนึ่งคำสั่ง

นั่นคือสิ่งที่SPLมา - มันเป็นหนึ่งใน opcodes ที่แปลกประหลาดที่สุดใน Redcode โดยพื้นฐานแล้วมันเป็นคำสั่ง "Branch Two Ways" คุณเห็นแทนที่จะลงทะเบียน "program counter" แบบง่ายๆเช่นเดียวกับ CPU ทั่วไปใด ๆ Redcode VM จะมี "process queue": รายการตัวชี้ที่เป็นวงกลมเพื่อรับคำแนะนำในการดำเนินการ โดยปกติในแต่ละรอบตัวชี้คำสั่งจะถูกเลื่อนออกจากหัวของคิวคำสั่งจะถูกดำเนินการและคำสั่งถัดไป (ยกเว้นว่ามีการกระโดดหรือคำสั่งที่ผิดกฎหมาย) ถูกผลักลงบนหางของคิว แต่SPLสาเหตุที่ทำให้ทั้งการเรียนการสอนต่อไปและการเรียนการสอนเป้าหมายที่กำหนด (ซึ่งในกรณีของSPL 1เป็นยังสอนต่อไป) ที่จะผลักดันเข้าสู่คิว

ผลที่สุดของทั้งหมดนี้คือหลังจากที่SPL 1คำสั่งทั้งสองได้ดำเนินการแล้วตอนนี้มีสี่กระบวนการในคิวทั้งหมดเกี่ยวกับการดำเนินการที่ผ่านMOVมา นี่คือพอเพียงที่จะเช็ดJMNทั้งSPLs และMOVตัวเองและก็ยังใบptrถือเป็นคำแนะนำDAT 0, 0- แยกไม่ออกจากแกนว่างรอบมัน

(หรืออีกวิธีหนึ่งเราสามารถแทนที่ptrคำสั่งด้วยMOV 1, 1ซึ่งจะได้รับการแปลงMOV 1, 0เป็นคำสั่งก่อนหน้าและดังนั้นจะได้ลบล้างตัวเองเหมือนกับโปรแกรมแรกที่ทำ)

ps หากคุณต้องการทดสอบโปรแกรมเหล่านี้ดาวน์โหลดตัวจำลอง Redcode (aka MARS) ผมอยากแนะนำให้ทั้งCoreWinหรือเคารพpMARSแม้ว่าจะมีหลายจำลองที่ดีอื่น ๆ ด้วย


จะไม่เป็นการละเมิดการเข้าถึงหรือไม่
Danny Varod

12
การละเมิดการเข้าถึง? สิ่งที่แปลกคืออะไร? (. อย่างจริงจัง Redcode ทำงานในนามธรรมสวย VM อยู่ทั้งหมดเป็นญาติพื้นที่ที่อยู่ติดกัน (และวงกลม) และที่อยู่ของทุกคนเป็นที่ถูกต้อง.)
Ilmari Karonen

MOV 1, 0 คัดลอก 1 ไปยังที่อยู่ 0 หรือวิธีอื่น ๆ หรือไม่? ในภาษาแอสเซมเบลอร์ทั้งหมดฉันรู้ว่าที่อยู่ 0 เป็นสิ่งผิดกฎหมาย (ที่อยู่ NULL)
Danny Varod

4
MOV source, destไวยากรณ์ แต่อย่างที่ฉันบอกว่าการระบุที่อยู่ใน Redcode นั้นสัมพันธ์กันดังนั้นที่อยู่จึง0หมายถึง "ที่อยู่ของคำสั่งนี้" ในขณะที่ที่อยู่1นั้นหมายถึง "ที่อยู่ของคำสั่งนี้ + 1" (และที่อยู่สัมบูรณ์ 0 ไม่ได้อยู่ใน Redcode แต่อย่างใดในความเป็นจริงผลที่น่าสนใจอย่างหนึ่งของการออกแบบ "การกำหนดที่อยู่ทั้งหมด" คือว่ามันเป็นไปไม่ได้จริง ๆที่โปรแกรม Redcode จะหาที่อยู่สัมบูรณ์ของตนเอง )
Ilmari Karonen

2
ผู้ชายฉันรู้สึกขอบคุณคุณมาก ฉันไม่เคยได้ยินเกี่ยวกับสงครามแกน
seequ

32

C

#include <conio.h>  /* Computer-Operated Nuclear Installation Options */
int main () {
    clrscr();       /* Commence Launch (Remote Systems Console Request) */
    kbhit();        /* Keep Busy until hit */
}

โปรดทราบว่านี่ไม่ใช่รหัสพกพา จะทำงานร่วมกับ ZOG C บนDS9000 ART ฉันเชื่อว่าการใช้อาวุธที่ไม่เป็นทางการนั้นทำให้รหัสนี้มีคุณสมบัติสำหรับความท้าทายนี้ หากคุณกังวลว่าการล่าช้าในการส่งมอบโค้ดนั้นจะไม่ผ่านการพิจารณาในทันทีโปรดติดต่อเราเพื่อขอคำแนะนำเกี่ยวกับการนัดหยุดงานล่วงหน้า

effect of launch

ในเครื่องที่บ้านของฉันมันไม่ได้รวบรวม - ฉันไม่มีไดรเวอร์และไลบรารีที่เหมาะสม ฉันได้ยินมาว่ามีการใช้งาน C ที่เป็นที่นิยมซึ่งโปรแกรมนี้รวบรวมและวิ่งไปสู่เอฟเฟกต์ที่น่าประทับใจน้อยลง แต่ฉันไม่เคยมีความกล้าที่จะลอง


2
คำตอบที่ดีที่สุดลงมือ!
เวกเตอร์

3
+1. (0) 1; ในตอนแรกผมคิดว่าจะถูกหลอก @Gilles ที่นี่ ... แต่แล้วฉันจะตรวจสอบหน้าเว็บ ART อิงค์ ... และมันก็แล้วเมื่อฉันตระหนักถึงวิธีการอย่างหนักผมก็ trolled!
vaxquis


28

C #

ฆ่าตัวตายด้วยการฆ่าทุกขั้นตอนยกเว้นตัวเอง

foreach (Process p in Process.GetProcesses()) {
    string myexe = Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
    if (p.ProcessName == myexe) continue;
    p.Kill();
}

เพื่อเพิ่มรสชาติให้น้อยเราสามารถ PInvoke TerminateProcessแทนที่จะใช้Process.Kill


4
+1 สำหรับวิธีการที่แปลกใหม่ในการฆ่าทุก ๆ สิ่งอื่น ๆ ทำให้โปรแกรมของคุณลงไปพร้อมกับระบบ (หรืออย่างน้อยฉันคิดว่านั่นเป็นแนวคิด ฉันไม่มี C # runtime บนเครื่องนี้ แต่ฉันต้องถาม ... ในทางปฏิบัตินี่จะทำให้ระบบล่มหรือกระบวนการทำงานทั้งหมดหรือไม่ (ฉันคิดว่าโปรแกรม C # เรียกใช้ตัวแปลภาษาเองดังนั้นจึงไม่ต้องพึ่งพากระบวนการ JIT / CIL ที่เฉพาะเจาะจง ... ) อีกครั้งงานที่ยอดเยี่ยมคิดว่า 'นอกกรอบ' (har har) ในนี้ :)
Breakthrough

4
-1 (ถ้าฉันมีตัวแทน): เมตาในการหลอกล่อรหัสบอกว่าไม่อนุญาตให้ใช้คำตอบแบบทำลายล้างเนื่องจากความเสี่ยงของคนที่ทดลองใช้พวกเขาด้วยเครื่องของตัวเอง ดูสัญลักษณ์แสดงหัวข้อย่อยที่สองในรายการของข้อ จำกัด : codegolf.stackexchange.com/tags/code-trolling/info
Kevin - Reinstate Monica

ไม่สามารถฆ่ากระบวนการของระบบได้หากไม่มีสิทธิ์ของผู้ดูแลระบบใช่ไหม
Sarge Borsch

3
@Kevin code-challengeและcode-trollingเป็นแท็กต่าง ๆ ที่มีกฎแตกต่างกัน
osvein

3
@ user1981338: คำถามเดิมมีแท็กการหมุนรหัส แต่มันได้ถูกแก้ไข ตอนนี้แท็กหายไป +1
Kevin - Reinstate Monica

21

BASH - 12 ตัวอักษร

:(){ :|:&};:

Classic forkbomb ล็อคคอมพิวเตอร์และบังคับให้ผู้ใช้ (หรือผู้ดูแลระบบ) รีบูต


5
น่าเบื่อ - แต่ก็ยังเป็นรายการโปรดส่วนตัวของฉัน ฉันใช้สิ่งนี้เพื่อปิดระบบที่ใช้งานอยู่
s3lph

3
มันเริ่มตัวเองหลาย ๆ ครั้งเท่าที่จะทำได้
marinus

1
แต่มันจะเริ่มต้นกระบวนการให้มากที่สุดเท่าที่จะเป็นไปได้จนกว่าคอมพิวเตอร์จะหยุดทำงานดังนั้นโปรแกรมจึงออกจากโปรแกรม
s3lph

14
+1 สำหรับการเพิ่มรอยยิ้มเช่น:()และ:|
ProgramFOX

1
@Kartik: หากไม่มีช่องว่างแรกคุณจะได้รับข้อผิดพลาดทางไวยากรณ์ คุณสามารถกำจัดอันที่สอง
เดนนิส

20

Python (สำหรับแล็ปท็อปรุ่นเก่า)

สำหรับแล็ปท็อปรุ่นเก่าที่มีโปรเซสเซอร์แกนเดียวและการระบายความร้อนที่ไม่ดี:

while True:
    print("CPU Temperature rising")

เมื่อแล็ปท็อประเบิด (หรือปิดเครื่อง) หลังจากผ่านไปสองสามชั่วโมงโปรแกรมจะไม่ทำงาน

(เพื่อผลลัพธ์ที่ดีที่สุดให้ห่อแล็ปท็อปไว้ในผ้าห่มหรืออะไรก็ตาม)


18

ทับทิม

kills ใช้กระบวนการ ruby ​​/ irb ที่ทำงานบน * ระวัง

`kill #{$$}`

2
ฉันชอบความสง่างามของอันนี้ +1
Doorknob

18

Apple 2 Basic

1 PRINT "HELLO"
2 POKE 2053,128
3 POKE 2054,58
4 GOTO 1

ENDมันเขียนทับหนึ่งในคำแนะนำที่มี


สิ่งนี้ทำงานอย่างไร
โยฮันเนส

5
@Johannes: ใน Applesoft BASIC โปรแกรมจะถูกจัดเก็บในรูปแบบโทเค็นในหน่วยความจำ เนื่องจากไม่มีระบบปฏิบัติการหรือการป้องกันหน่วยความจำจึงจัดเก็บไว้ในที่เดียวกันเสมอและไม่มีสิ่งใดที่จะห้ามไม่ให้คุณเขียนลงในหน่วยความจำนั้น ดังนั้นอันแรกที่POKEเขียนENDโทเค็นเหนือPRINTโทเค็นจากนั้นอันที่สองจะPOKEเขียนคำสั่งด้าน"บน เมื่อGOTOดำเนินการมันจะจบลงด้วยการทำงานENDแทนPRINTและโปรแกรมจะสิ้นสุดลง
marinus

14

ในการชุมนุมบางสิ่งเช่นนี้น่าจะได้ผล:

jmp 0

ฉันจำได้ว่าคอมไพล์นี่ใช้งานได้จริง ย้อนกลับไปมันรีคอมพิวเตอร์


ลองใหม่ จริงๆแล้วฉันจะโพสต์สิ่งนี้เป็นคำตอบ: P
Julien Lebot

retf จะทำงานผมใส่อยู่แล้วว่าในคำตอบ :) มันฆ่ามันเพราะการทำงานของหน่วยความจำวิธีการแบ่งส่วน (หรือไม่ได้ทำงานผมควรจะพูด) บนระบบปฏิบัติการที่ทันสมัย
chbaker0

» jmp 0 «ใช้งานได้กับ DOS 'ทำให้สองไบต์แรกของส่วนรหัสคือ CD 20 หรือ' INT 20 'ซึ่งเป็นรหัสสำหรับออกจากโปรแกรม »กด 0; ret «จะมีผลเหมือนกันไหม
Daniel

13

PHP

function quit(){unlink(__FILE__);posix_kill(getmypid(),15);}

ผลกระทบ:
ลบไฟล์สคริปต์เส็งเคร็งของคุณแล้วฆ่าโปรแกรมของคุณ
โยนหนึ่งในเด็กเลวเหล่านี้ลงใน codebase เพื่อสร้างความสับสนให้ผู้คน


นี่ไม่ใช่ไวยากรณ์ PHP ที่ถูกต้อง คุณพยายามกำหนดฟังก์ชั่นquitแต่รายการพารามิเตอร์คือรหัสที่จะเรียกใช้ ฉันพบข้อผิดพลาดในการแยกวิเคราะห์เมื่อพยายามเรียกใช้
Emil Vikström

@ EmilVikström - แก้ไขแล้ว
donutdan4114

12

C, 9 ตัวอักษร

gccคอมไพล์ด้วยและคอมไพเลอร์อื่น ๆ ที่ไม่สนใจรายละเอียดเล็ก ๆ น้อย ๆ อย่างการmainไม่ใช้ฟังก์ชั่น
ใช้งานได้บนx86แพลตฟอร์ม - โปรแกรมออกทันที

main=195;

195 คือ opcode ของretคำสั่ง


4
Segfaults สำหรับฉัน mainอยู่ใน.dataเพราะมันเป็น int ไม่อยู่ใน.textและ.dataโหลดลงในหน้าเว็บที่ไม่สามารถดำเนินการได้
mniip

10

ฉันต้องการโพสต์ที่นี่เสมอฉันคิดว่ามันเหมาะกับที่นี่แม้ว่าจะมีคำตอบที่ยอมรับแล้ว

int
main(int argc, char **argv)
{
        revoke(*argv);
}

สิ่งนี้ใช้ได้กับระบบ 4.3BSD ที่โพสต์และอื่น ๆ ที่ใช้งานrevokeในลักษณะเดียวกัน ลินุกซ์ไม่ได้มีต้นแบบสำหรับมัน แต่ MacOS เคยทำมาแล้ว แต่กลับมาผิดพลาดในเวอร์ชั่นล่าสุด

revokeใช้พา ธ ไปยังไฟล์และบังคับให้ทำลายการอ้างอิงทั้งหมดไปยังไฟล์นั้น ซึ่งรวมถึงการแมปหน่วยความจำของไฟล์นั้นแม้แต่ไฟล์ที่เรียกใช้งานได้เอง เห็นได้ชัดว่าคุณต้องเริ่มโปรแกรมด้วยพา ธ ซึ่งจะไม่สามารถใช้งานได้หากเกิดขึ้นใน PATH

ความแตกต่างของสิ่งนี้ที่ควรใช้ได้กับระบบยูนิกซ์ส่วนใหญ่คือ:

#include <sys/mman.h>
#include <inttypes.h>
#include <unistd.h>

int
main(int argc, char **argv)
{
        intptr_t ps = getpagesize();
        munmap((void *)(((intptr_t)main)&~(ps - 1)), ps);
}

เราเพียงยกเลิกการแมปหน้าที่เชื่อมโยงmainเพื่อที่ว่าเมื่อมีการโทรmunmapกลับ มีโอกาสเล็กน้อยที่ฟังก์ชันจะเรียกใช้munmapอยู่บนขอบเขตหน้าและการส่งคืนจะประสบความสำเร็จดังนั้นเพื่อให้แน่ใจว่างานนี้สมบูรณ์แบบเราอาจต้องพยายามยกเลิกการทำแผนที่สองหน้าก่อน

และแน่นอนรูปแบบของชุดรูปแบบเดียวกัน:

#include <sys/mman.h>
#include <inttypes.h>
#include <unistd.h>

int
main(int argc, char **argv)
{
        intptr_t ps = getpagesize();
        munmap((void *)(((intptr_t)&ps)&~(ps - 1)), ps);
}

เพียงแค่ทำการแมปกองซ้อนเพื่อที่เราจะได้ไม่ต้องไปไหน ข้อแม้เช่นเดียวกับการแมปmain - เราอาจต้องยกเลิกการแมปสองหน้ายกเว้นว่าเราต้องจำไว้ว่าสแต็กอาจโตขึ้น (เว้นแต่ว่าคุณใช้ PA-RISC หรือสถาปัตยกรรมแปลก ๆ อื่น ๆ เช่นนั้น)

อีกวิธีในการดึงพรมจากใต้ฝ่าเท้าของคุณ:

#include <sys/resource.h>

int
main(int argc, char **argv)
{
        setrlimit(RLIMIT_CPU, &((struct rlimit){ 0 }));
        while(1);
}

มันเป็นระบบปฏิบัติการขึ้นอยู่กับวิธีที่ระบบจัดการกับข้อ จำกัด ของ cpu 0 วินาทีและความถี่ในการทำ cpu time MacOS ฆ่ากระบวนการทันที Linux ต้องการขณะที่ลูประบบอื่นที่ฉันพยายามไม่ได้ทำอะไรเลยแม้จะมีขีด จำกัด ที่หนึ่งและลูปในขณะที่ฉันไม่ได้แก้จุดบกพร่องเพิ่มเติม


9

ดวลจุดโทษ

sudo kill -SEGV 1

kernal ตื่นตระหนกทันทีบน Linux ทำลายกระบวนการทั้งหมดรวมถึงตัวมันเอง

cmd

pskill csrss.exe

หน้าจอสีน้ำเงินทันทีบน Windows Client/Server Runtime SubSystemยุติ ต้องติดตั้ง Pskill


จะใช้killall initงานได้ไหม
s3lph

1
@the_Seppi 1. เฉพาะผู้ใช้ระดับรากเท่านั้นที่สามารถส่งสัญญาณไปยัง init 2 ได้ในตอนแรกจะทำให้เกิดความตื่นตระหนกในกรณีที่ได้รับสัญญาณ 11 (ข้อผิดพลาดในการแยกส่วน)
MultiplyByZer0

ตกลงขอบคุณ ... คุณรู้ไหมว่าจะเกิดอะไรขึ้นถ้าคุณใช้sudo killall init
s3lph

1
@the_Seppi ใช่ฉันเคยลองมาก่อน เริ่มต้นละเว้นมันเนื่องจาก init สามารถตัดสินใจได้ว่าจะรับสัญญาณหรือไม่ดังนั้นจึงไม่สนใจ SIGKILL unix.stackexchange.com/questions/7441/…
MultiplyByZer0

8

ใน C (รองรับ Windows / Linux / (อาจเป็น Unix / Freed BSD ด้วย):

main;

ตัวอย่างการใช้งาน:

ภายใต้ Windows คอมไพล์ด้วย:

echo main; > main.c && cl /Fe:main.exe main.c

และ Linux:

echo "main;" > main.c && gcc -w -o main main.c

สมมติว่าคอมไพเลอร์ถูกติดตั้งและในตัวแปร PATH ปัจจุบัน

แก้ไข: ในทางเทคนิคมันจะโยนข้อยกเว้น (ยกโดยหน่วยประมวลผล) บน Linux แต่ไม่มีข้อความดังกล่าวบน Windows ดังนั้นรายการนี้อาจไม่ถูกต้อง อย่างไรก็ตามฉันคิดว่ามันเจ๋ง: หน้า

แก้ไข: ในแอสเซมเบลอร์ x86 (ใช้ NAsm / YAsm)

global s
s:
    ret

รวบรวมกับ:

(Windows)

nasm -f win32 -o test.obj test.asm
LINK /OUT:test.exe /SUBSYSTEM:CONSOLE /ENTRY:s test.obj

(Linux)

nasm -f elf32 -o test.obj test.asm
ld -o test -e s test.obj

น่าเสียดายที่วิธีนี้สร้างคอร์ดัลบน linux ด้วยดังนั้นฉันเชื่อว่ามันใช้งานได้เทียบเท่ากับวิธี C ยกเว้นมีประสิทธิภาพมากขึ้น


1
ว้าว! ฉันรวบรวมมันด้วย-Wall -Wextra -std=c99 -pedanticและไม่มีการเตือนใด ๆ เลย
ldrumm

ฉันอยากจะใส่สิ่งนี้ แต่ตัดสินใจเพราะมันจะเป็นการซ้ำซ้อนของการแก้ไขปัญหาที่แตกต่างกัน ( codegolf.stackexchange.com/a/8778/3103 )
Konrad Borowski

7

ทำสิ่งต่าง ๆ อย่างแท้จริงด้วยวิธีที่ไร้สาระด้วย Haskell:

import System.Exit

absolutely doThis = if True then doThis else undefined

unconventional doThat = do
  putStrLn "I could just do that"
  putStrLn "But I'm gonna print factorial of 100 first"
  putStrLn "There you go:"
  print $ fac 100
  doThat
  where fac n = foldl (*) 1 [1..n]

main = absolutely unconventional exitFailure

6

หลาม


ใช้โมดูลเราสามารถวางไข่หัวข้ออื่นที่มีหน้าที่คือการสื่อสารกับกระบวนการเดิมผ่านคิวบอกเมื่อจบการทำงาน:multiprocessing

import multiprocessing
import time
queue = multiprocessing.Queue()

def second_thread():
    while True:
        queue.put('quit')
        time.sleep(0.1)

second_ps = multiprocessing.Process(target = second_thread)
second_ps.start()

while True:
    msg = queue.get()
    if msg == 'quit':
        break
    time.sleep(0.1)

second_ps.join()

6

ANSI C

หากไม่มีการปรับรหัสให้เหมาะสมโปรแกรมต่อไปนี้จึงออกอย่างรวดเร็ว - ไม่สามารถเปิดใช้งานได้จริงแม้ว่าจะรวบรวมเป็นโปรแกรมที่ถูกต้อง

#include<stdlib.h>
#include<stdio.h>

char tooLong[0x7CFFFFFF];

void main()
{
    printf("never executed.");
}

สิ่งนี้อาจขึ้นอยู่กับระบบ - แสดงความคิดเห็นหากคุณสามารถเปิดใช้งานได้


"การออกจากการโยนข้อยกเว้นจะไม่ได้รับการยอมรับอีกต่อไป!" และสิ่งนี้รวมถึงข้อผิดพลาดออกจากหน่วยความจำ
John Dvorak

2
@JanDvorak มีความแตกต่างระหว่างที่มีข้อผิดพลาดและข้อยกเว้น
syb0rg

ฉันเชื่อว่ากฎนี้ครอบคลุมทั้งสองอย่าง ผู้ถามสามารถชี้แจงได้หรือไม่ และไม่ฉันไม่คิดว่าคำถาม SO เฉพาะของ Java เป็นข้อมูลอ้างอิงที่ดีโดยเฉพาะเมื่อคุณปกป้องโซลูชัน C
John Dvorak

9
โปรแกรมไม่ส่งข้อผิดพลาดและไม่ทำให้เกิดข้อผิดพลาดภายในโปรแกรม ระบบไม่สามารถจัดการได้
โยฮันเนส

6

ถูก ถ้าเพียงโทรมาSystem.exitไม่ได้รับอนุญาตใน Java วิธีการโทรด้วยการสะท้อนจากเธรดอื่น

import java.lang.reflect.*;

public class Quit {
    public static void main(String[] args) throws Exception {
        final Method exit = System.class.getMethod("exit", new Class<?>[]{ int.class });
        new Thread(new Runnable() {
            @Override public void run() {
                try {
                    System.out.println("calling... " + exit);
                    exit.invoke(null, new Object[] { 0 });
                } catch (Exception e) { e.printStackTrace(); }
            }
        }).start();
        for (int i = 1; ; ++i) {
            System.out.println("counting... " + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) { break; }
        }
    }
}

ค้นหาเมธอด exit วางไข่เธรดใหม่และนับถอยหลังจนกว่าเธรดนั้นจะฆ่ากระบวนการโดยการเรียก exit ผ่านการสะท้อนกลับ


นับถอยหลังไหม ดูเหมือนว่าจะนับขึ้นกับฉัน
Justin

1
เอ่อใช่จุดดี ฉันควรจะพูดว่านับขึ้นหรือแค่บอกว่านับจนกว่ามันจะออก
David Conrad

6

ภาษาเครื่อง x86, 1 ตัวอักษร

โดยปกติคุณสามารถทำให้สามารถเรียกใช้งานได้จากคำสั่ง RET เดียว

\xC3 

4
เป็นวิธีที่แปลกใหม่!
aditsu

6

C (Linux)

รุ่นการฆ่าตัวตาย

ส่ง SIGKILL ให้กับตัวเอง

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int main() 
{
    kill(getpid(),SIGKILL);

    printf("Not killed");
}

รุ่น "Tu quoque mi fili"

ฟอร์กจากนั้นลูกชายก็ฆ่าพ่อ

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int main() 
{
    if (!fork())
        kill(getppid(), SIGKILL);

    printf("Not killed");
}

5

Perl

...

นั้นคือทั้งหมด.


คำอธิบาย: มันจะโยนข้อยกเว้นUnimplementedและออกทันที


เพิ่มคำอธิบาย
PhiNotPi

3
ฉันไม่รู้ว่ามีข้อยกเว้นที่น่าเบื่อ

6
Invalif เนื่องจากการปรับตัวที่ท้าทาย: ไม่มีข้อยกเว้น
s3lph

ฉันยังไม่ได้เขียนคำตอบอีกเลย
PhiNotPi

5

Batch & Debug

Oldie แต่ goodie ทำงานบนเครื่อง DOS เพื่อเริ่มระบบใหม่ทันที โบนัสที่เป็นหนึ่งสคริปต์ตั้งใจที่จะตีความโดยสองล่ามที่แตกต่างกันและเข้ากันไม่ได้

reset.bat

goto start

rcs
ffff
rip
0000
g
:start
debug < reset.bat

การตีความไฟล์แบทช์ข้ามคำแนะนำสำหรับการดีบักและฟีดตัวเองเพื่อดีบักสำหรับการตีความ gotoจำเป็นต้องมีบรรทัดว่างหลังจากนั้นเพื่อล้างข้อผิดพลาดในdebugผลลัพธ์นั้นเนื่องจากมันถูกป้อนคำสั่งที่ไม่รู้จักซึ่งก็คือ goto


1
ฉันเคยทำสิ่งเดียวกันกับ ธ.ค. ขวาน ขวานดัน กด bx; retf
moopet

3

ชวา

โค้ดด้านล่างนี้ไม่ได้ทำการทดสอบและจะใช้ได้กับบางแพลตฟอร์มเท่านั้น

public class Quitter
{
       public static void main ( String [ ] args )
       {
             Process process = Runtime . getRuntime ( ) . exec ( "reboot" ) ;
       }
}

45
อะไรกับช่องว่างที่น่ากลัวนั่น
Doorknob

7
ใน UNIX มันจะต้องเป็นsudo rebootบน Windowsshutdown /r /t 0
s3lph

2
บน UNIX คุณต้องรันโปรแกรมนั้นด้วย sudo ไม่ใช่คำสั่งที่คุณต้องการเรียกใช้
Johannes Kuhn

1
@ the_Seppi, @ JohannesKuhn อย่างที่ฉันบอกว่ามันใช้ได้กับบางแพลตฟอร์มเท่านั้นและฉันคิดว่าคุณจะเรียกมันเช่นsudo java Quitterนั้น
emory

3
-1 ไม่เพียงพอ WHITESPACE !!!
vaxquis

3

Powershell

get-process | stop-process -force

บันทึกสิ่งนี้เป็น 'lastresort.ps1' และควรทำเคล็ดลับ

หากคุณพบปัญหาเกี่ยวกับสคริปต์ที่ไม่ได้ดำเนินการเนื่องจากมีนโยบายโง่ ๆ ให้พิมพ์สิ่งนี้ก่อนดำเนินการสคริปต์:

Set-ExecutionPolicy Unrestricted

ทำงานได้ดีจากบรรทัดคำสั่งโดยไม่บันทึกเป็นสคริปต์
Iszi


3

Python (ทางเลือกหนึ่งบรรทัดไปที่ OP)

ฉันคิดว่าไม่มีคำตอบของ Python ที่ดีกว่าคำแนะนำของ OP แต่จริง ๆ แล้วฉันไม่ชอบว่ามันมีหลายบรรทัดดังนั้นนี่คือวิธีที่คุณทำอย่างที่ OP ทำ แต่ในหนึ่งบรรทัด:

exec(''.join([ chr(x) for x in [35, 33, 47, 117, 115, 114, 47, 98, 105, 110, 47, 101, 110, 118, 32, 112, 121, 116, 104, 111, 110, 10, 35, 32, 117, 110, 105, 120, 32, 111, 110, 108, 121, 44, 32, 109, 105, 103, 104, 116, 32, 119, 111, 114, 107, 32, 111, 110, 32, 119, 105, 110, 100, 111, 119, 115, 10, 35, 32, 110, 111, 116, 101, 58, 32, 107, 105, 108, 108, 115, 32, 65, 76, 76, 32, 82, 85, 78, 78, 73, 78, 71, 32, 112, 121, 116, 104, 111, 110, 32, 112, 114, 111, 99, 101, 115, 115, 101, 115, 46, 32, 66, 101, 32, 99, 97, 114, 101, 102, 117, 108, 32, 47, 33, 92, 10, 100, 101, 102, 32, 101, 120, 105, 116, 40, 41, 58, 10, 32, 32, 32, 32, 105, 109, 112, 111, 114, 116, 32, 111, 115, 10, 32, 32, 32, 32, 111, 115, 46, 115, 121, 115, 116, 101, 109, 40, 34, 107, 105, 108, 108, 97, 108, 108, 32, 112, 121, 116, 104, 111, 110, 51, 34, 41, 10, 32, 32, 32, 32, 35, 32, 87, 105, 110, 100, 111, 119, 115, 32, 97, 100, 100, 111, 110, 10, 32, 32, 32, 32, 111, 115, 46, 115, 121, 115, 116, 101, 109, 40, 34, 116, 97, 115, 107, 107, 105, 108, 108, 32, 47, 105, 109, 32, 112, 121, 116, 104, 111, 110, 46, 101, 120, 101, 32, 47, 102, 34, 41, 32, 35, 32, 111, 114, 32, 119, 104, 97, 116, 101, 118, 101, 114, 32, 102, 105, 108, 101, 110, 97, 109, 101, 32, 112, 121, 116, 104, 111, 110, 64, 119, 105, 110, 100, 111, 119, 115, 32, 104, 97, 115, 10, 101, 120, 105, 116, 40, 41, 10] ]))

คุณสามารถทำให้ฟังก์ชั่นนี้และมันจะทำงานให้คุณ


3

ความคิดของฉันเองไม่เข้าร่วม

TIGCC (สำหรับ Texas Instrumens TI-89, TI-89 Titanium, TI-92 +, TI-V200)

void main(void) {
    unlink("quit");
    asm("trap #2");
}

TI-Basic สำหรับเครื่องคิดเลขเดียวกัน

quit()
:© lines starting with © are comments
:Prgm
:©DelVar quit
:Exec "4E424E750000"
:EndPrgm

สิ่งที่โปรแกรมทำ: ขั้นแรกให้ลบตัวเองออกจาก RAM (อย่านำไปไว้ใน ROM มิเช่นนั้นจะใช้งานไม่ได้ ... ) มันยังสามารถทำงานต่อไปได้เนื่องจากในการประมวลผลสำเนาของโปรแกรมจะถูกสร้างและดำเนินการ asm(trap #2);เรียกใช้คำสั่ง ASM4E424E750000ซึ่งเป็นคำสั่งเพื่อรีเซ็ตเครื่องคิดเลขลบมันเป็น RAM (Flash ROM ยังคงไม่ถูกแตะต้อง) และติดตั้งแอปพลิเคชันทั้งหมดใหม่

แก้ไข: เพิ่งทดสอบรุ่นพื้นฐาน ไม่สามารถลบตัวเอง ...


3

รูปแบบ MS-DOS .com

มันเขียนคำแนะนำที่ไม่ถูกต้อง (FFFF) ลงในหน่วยความจำแล้วดำเนินการตามคำสั่งทำให้เกิดข้อผิดพลาด NTVDM

เลขฐานสิบหก

B8 FF FF A3 06 01

ภาษาแอสเซมบลี Debug.exe

MOV AX, FFFF
MOV [0106],AX
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.