ขัดข้องคอมไพเลอร์ที่คุณชื่นชอบ [ปิด]


44

เขียนรหัสทางกฎหมายอย่างสมบูรณ์ในภาษาที่คุณเลือกซึ่งการรวบรวมจะทำให้คอมไพเลอร์ผิดพลาดหรือส่งไปยังวงวนไม่สิ้นสุด (เวลารวบรวมไม่สิ้นสุด)

ข้อ จำกัด:

  • ใช้ภาษามาตรฐานที่ใช้ในโลกแห่งความเป็นจริง
  • ใช้คอมไพเลอร์มาตรฐานที่ได้รับการพัฒนามาอย่างดี (ไม่มีคำตอบเช่น "ฉันเขียนคอมไพเลอร์ C ของฉันที่ขัดข้องทุกอย่าง")
  • รหัสจะต้องถูกกฎหมายในภาษา (ดังนั้นส่วนใหญ่คุณจะต้องใช้ประโยชน์จากคอมไพเลอร์หรือข้อบกพร่องทางภาษา)
  • ใช้เวอร์ชันคอมไพเลอร์และตัวเลือกของคุณเพื่อให้ผู้อื่นสามารถทำซ้ำได้
  • อธิบายว่าทำไมคอมไพเลอร์จึงล้มเหลวถ้าเป็นไปได้

มีความสุข :)


4
คุณช่วยอธิบายรายละเอียดเกี่ยวกับสิ่งที่คุณ "ผิดพลาด" ได้ไหม
Mr. Llama

@GigaWatt ฉันหมายถึงคอมไพเลอร์หยุดในทางที่ไม่ได้ตั้งใจ ไม่สามารถรวบรวมอินพุตหรือการออกข้อความแสดงข้อผิดพลาดได้สำเร็จ มันมีปัญหาจริงๆเช่นsegfault , กินหน่วยความจำทั้งหมด, โยนข้อยกเว้นที่ไม่ถูกตรวจสอบ ฯลฯ
Petr Pudlák

1
การประกวดครั้งนี้ส่วนใหญ่เป็นเพียงแบบฝึกหัดในการค้นหารายงานข้อผิดพลาดสำหรับกรณีทดสอบ: /
Sparr

1
อนุญาตให้ใช้ล่ามได้หรือไม่
ทำเครื่องหมาย

1
โหวตเพื่อเปิดใหม่!
noɥʇʎԀʎzɐɹƆ

คำตอบ:


21

ฉันค่อนข้างแน่ใจว่าตอนนี้ได้รับการแก้ไขแล้ว แต่มันเคยเป็นที่คุณสามารถทำผิดพลาดคอมไพเลอร์ Java (หรือ, Eclipse ผิดพลาด) โดยการเขียน

class Foo {
  static double d = 2.2250738585072012e-308;
}

http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/

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


48

ทางออกที่ฉันชอบสำหรับ GHC:

data Bad a = C (Bad a -> a)

xx :: Bad a -> a
xx (x@(C x')) = x' x

omega :: a
omega = xx (C xx)

main = omega

สำหรับ GHC 6.12.1 ทั้งสองghci Bad.hsและghc Bad.hsวนซ้ำไม่สิ้นสุด GHC 7.4.1 วนghc -O2 Bad.hsซ้ำไม่สิ้นสุดเมื่อมีการดำเนินการ

คำอธิบาย: omegaถูกกำหนดโดยใช้การเรียกซ้ำแบบไม่สิ้นสุด (วิธีเดียวที่สามารถอยู่ได้ทุกประเภท) Inliner คอมไพเลอร์ของเห็นxxเป็นที่เรียบง่ายฟังก์ชั่นที่ไม่ซ้ำจึงพยายามที่จะ inline omegaมันอยู่ในความหมายของ (\x@(C x') -> x' x) (C xx)ได้ผลในการ เห็นรูปแบบการจับคู่บนตัวสร้างคอมไพเลอร์พยายามที่จะลดลงได้รับxx (C xx)อีกครั้งและลูป เคล็ดลับคือการxxเรียกซ้ำ แต่การเรียกซ้ำถูกซ่อนอยู่ภายในชนิดข้อมูล

หมายเหตุ: ในขณะที่เขียนตัวต่อฉันลืมไปเลยว่าฉันปล่อยให้ GHC วิ่งวนซ้ำไปเรื่อย ๆ ใช้หน่วยความจำทั้งหมดของฉันขัดข้อง Firefox และฉันแทบจะไม่สามารถฆ่ามันได้โดยไม่ต้องรีเซ็ตฮาร์ด


5
+1 สำหรับปัญหาที่คุณเผชิญเพื่อหาคำตอบ: P
UnkwnTech

4
@ UnkwnTech :-) ที่จริงฉันค้นพบสิ่งนี้โดยบังเอิญเมื่อพยายามใช้การเรียกซ้ำโดยใช้ชนิดข้อมูลแบบเรียกซ้ำเท่านั้น
Petr Pudlák

18

นี่เป็นภาษาที่พิมพ์ได้ง่าย การตรวจสอบประเภทขึ้นอยู่กับประเภททั่วไปนั้นไม่สามารถตัดสินใจได้เนื่องจากอาจต้องใช้การคำนวณที่ซับซ้อนโดยพลการ คุณสามารถเข้ารหัสในประเภทที่ขึ้นต่อกันด้วยค่าที่มากเกินไป จากนั้นตัวตรวจสอบชนิดจะใช้หน่วยความจำและข้อผิดพลาดที่มีอยู่ทั้งหมด ตัวอย่างเช่นใน Coq ReyCharles ให้ตัวอย่างCompute 70000.ซึ่งทำให้ตัวตรวจสอบชนิดสร้างตัวเลข Peano ขนาดยักษ์และการชน

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

#include <stdio.h>
#define a printf("%s", "Hello, world!\n");
#define b a a a a a a a a a a a a a a a a
#define c b b b b b b b b b b b b b b b b
#define d c c c c c c c c c c c c c c c c
#define e d d d d d d d d d d d d d d d d
#define f e e e e e e e e e e e e e e e e
// ...
#define z y y y y y y y y y y y y y y y y
int main() { z }

ภาษาการเขียนโปรแกรม D ช่วยให้การดำเนินการรวบรวมฟังก์ชั่นเวลา สิ่งนี้สามารถใช้เพื่อคำนวณบางสิ่งในเวลารวบรวมที่มีขนาดใหญ่เกินไปที่จะใส่ในหน่วยความจำ สิ่งที่คล้ายกันสามารถทำได้โดยใช้เมตาแกรมการเขียนโปรแกรม C ++

ใน XML (ไม่ใช่ภาษาการเขียนโปรแกรมที่คอมไพล์ แต่ตัวประมวลผล XML นั้นคล้ายคลึงกับคอมไพเลอร์) การขยายเอนทิตีสามารถทำให้หน่วยความจำหมด:

<?xml version="1.0"?>
<!DOCTYPE lolz [
 <!ENTITY lol "lol">
 <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
 <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
 <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
...
]>
<lolz>&lol999;</lolz>

นี้เรียกว่าการโจมตีพันล้านหัวเราะ


4
ทราบว่า<lolz>&lol999;</lolz>เป็น 10 ^ 999 หัวเราะไม่ใช่พันล้าน การอ้างอิงที่เชื่อมโยงใช้<lolz>&lol9;</lolz>ซึ่งจริง ๆ แล้วเป็นพันล้าน
mbomb007

โปรดทราบว่าปัญหา Coq ไม่เกี่ยวข้องกับทัวริงครบถ้วน ระบบประเภทของ Coq ได้รับการออกแบบเป็นพิเศษเพื่อให้การตรวจสอบประเภทนั้นสามารถตัดสินใจได้และไม่สมบูรณ์ การตรวจสอบประเภทจะเป็นไปได้เสมอด้วยจำนวนหน่วยความจำคงที่ (และจะสิ้นสุดเสมอ) แต่ค่าคงที่นั้นขึ้นอยู่กับรหัสที่เป็นปัญหาและสามารถทำให้ใหญ่โดยพลการ
John Colanduoni

18

C #

พบสิ่งนี้ในคำถาม stackoverflow :

using System;
using System.Linq;

public class Test
{
    public static void Main()
    {
        Enumerable.Range(0, 1).Sum(a =>
        Enumerable.Range(0, 1).Sum(b =>
        Enumerable.Range(0, 1).Sum(c =>
        Enumerable.Range(0, 1).Sum(d =>
        Enumerable.Range(0, 1).Sum(e =>
        Enumerable.Range(0, 1).Sum(f =>
        Enumerable.Range(0, 1).Count(g => true)))))));
    }
}

คอมไพเลอร์ในที่สุดก็จะผิดพลาด

ดูเหมือนว่าปัญหาจะเกี่ยวข้องกับการอนุมานประเภทและ / หรือการสร้างแลมบ์ดารวมกับการแก้ปัญหาการโอเวอร์โหลด


13
+1 สำหรับการทำให้ระบบ Intellisense ของ Visual Studio ใช้หน่วยความจำที่มีอยู่ทั้งหมดและทำให้ IDE ขัดข้อง นี่เป็นเรื่องตลกที่ฉันจะใช้เพื่อพลังแห่งความดีเท่านั้น
ทำเครื่องหมาย

15

VBA

วิธีการเกี่ยวกับถ้าคุณสามารถชน IDE โดยการพิมพ์รหัส?

ในแอปพลิเคชัน Microsoft Office ใด ๆ ให้ลองสิ่งนี้:

ALT+ F11เพื่อไปที่หน้าต่าง VBA จากนั้นลองใช้รหัสต่อไปนี้

sub foo()
dim v(1 to 3, 1 to 3)
redim preserve v(,1 to 5)

และดูเถิด:

ความตายของ Excel

คุณสามารถพิมพ์redim preserve v(,1 to 5)ลงในหน้าต่างทันทีและมันจะผิดพลาดหลังจากที่คุณกดENTER!


ดี แต่ชอบมาก "crash interpreter ที่คุณชื่นชอบ"
mbx

ฉันจะได้รับบทสรุปโดยย่อเกี่ยวกับสาเหตุที่ใช้งานได้อย่างไร
Mr. Llama

1
@GigaWatt ก็กล่าวถึงในระดับความลึกมากขึ้นเล็ก ๆ น้อย ๆที่นี่แต่ก็ปรากฏว่า IDE ไม่สามารถรับมือกับข้อผิดพลาด (สัญลักษณ์ที่ไม่คาดคิด,และคาดว่า,)
SeanC

6

Perl (15)

BEGIN{1while 1}

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

บล็อกโค้ด BEGIN จะถูกดำเนินการโดยเร็วที่สุดนั่นคือช่วงเวลาที่มันถูกกำหนดอย่างสมบูรณ์แม้กระทั่งก่อนที่ไฟล์ที่เหลือ (หรือสตริง) ที่มีอยู่จะถูกวิเคราะห์

(จากperlmod )

และนั่นเป็นสาเหตุที่ Perl ไม่สามารถแยกรหัสได้อย่างสมบูรณ์ สิ่งนี้ไม่สิ้นสุด:

$ perl -MO=Deparse -e 'BEGIN{1while 1}'

5

J

segfaults นี้ J interpreter (อย่างน้อยบน Linux):

15!:1[3#2

มันพยายามที่จะอ่านจากที่อยู่ 2 หน่วยความจำที่น่าสนใจถ้าคุณลองกับ 0 หรือ 1 domain errorคุณจะได้รับ


5

เท็กซ์

\def\x{\x}\x

TeX เป็นภาษาส่วนขยายของแมโคร ที่นี่เรากำหนดขยายตัวของแมโคร\xจะเป็นอีกครั้งแล้วหลังจากนั้นเราเพิ่มการภาวนาของ\x \xเท็กซ์ได้รับติดอยู่ค้ำฟ้าแทนที่ด้วย\x\x


2
หมายเหตุ: นี่ไม่ใช่วิธีที่สั้นที่สุดในการบรรลุเป้าหมาย TeX มีแนวคิดของ "ตัวอักษรที่ใช้งาน" ซึ่งเป็นตัวละครที่ถือว่าเป็นชื่อแมโคร ดังนั้นคุณสามารถกำจัดตัวละคร 3 ตัวจากนี้
Hammerite

5

โครงการ

(define-syntax s
    (syntax-rules ()
        ((_ (t) ...) (s (t t) ... (t t) ...))
        ((_ (t u) ...) (s (t) ... (u) ...))))
(s (+))

Chicken ผู้เรียบเรียงของฉันทำผิดพลาดในการพยายามขยายมาโครในเวลารวบรวมสำหรับ "ประสิทธิภาพรันไทม์" หรือบางสิ่งบางอย่าง ดังนั้นมันจึงจ่ายราคาของการขยายอันนี้ ฉันอ่าน R5RS แล้ว ไม่มีใครบอกว่าจะต้องมีการขยายมาโครในเวลารวบรวม

โดยพื้นฐานแล้วสิ่งที่เกิดขึ้นคือมาโครขยายไปยังการแสดงออกของขนาดที่ไม่สิ้นสุด เพื่อเป็นเทคนิคเพิ่มการขยายตัวอื่น ๆ เป็นสองเท่า ชะตากรรมของคอมไพเลอร์ถูกปิดผนึก อย่างน้อยในระบบของฉันฝาไก่ที่ 2GB แผงลอยเป็นเวลานานพยายามที่จะเก็บขยะจากนั้นก็เกิดปัญหาหลังจากที่ตัวเก็บขยะเลิกใช้แล้ว อาจใช้เวลาสักครู่เนื่องจากเวทมนตร์ที่ถูกสุขลักษณะที่มีราคาแพงทั้งหมดเกิดขึ้น

การสลับระหว่างนิพจน์ของฟอร์ม

(s (+) (+) (+) (+) ....

และ

(s (+ +) (+ +) (+ +) (+ +) ....

ดูเหมือนว่าจะเพิ่มอัตราการใช้หน่วยความจำได้อย่างมากเมื่อเทียบกับ:

(define-syntax s
    (syntax-rules ()
        ((_ t ...) (s t ... t ...))))
(s +)

ฉันสงสัยว่า Chicken เป็นคอมไพเลอร์ที่มีความอดทนสูงซึ่งมีวิธีหลีกเลี่ยงการวิเคราะห์เชิงลึกของการแสดงออกทางไวยากรณ์เมื่อมันสามารถหนีไปได้


ว้าว +1 และยินดีต้อนรับสู่ไขปริศนาการเขียนโปรแกรมและ Code Golf Stack Exchange หากคุณต้องการความช่วยเหลือใด ๆ @wizzwizz4หรือเพียงแค่ต้องการที่จะพูดคุยอย่าลังเลที่จะตอบกลับความคิดเห็นนี้กับ
wizzwizz4

3

เสียงกระเพื่อมสามัญ

มาโครทำให้เป็นเรื่องง่าย:

(defmacro loop-forever ()
  (loop for x from 0 collecting x))

(defun compile-me ()
  (loop-forever))

การคอมไพล์การcompile-meโทรloop-foreverซึ่งใช้หน่วยความจำฮีประหว่างการขยายและการคอมไพเลอร์ขัดข้อง หากคุณเพียงต้องการทำให้คอมไพเลอร์แฮงค์ไปเรื่อย ๆ นิยามของคำสั่งนี้loop-foreverจะทำ:

(defmacro loop-forever ()
  (loop))

สิ่งนี้ควรทำงานโดยใช้การใช้ CL ใด ๆ เว้นแต่ว่าคุณมีความฉลาดมากและสามารถตรวจจับลูปไม่สิ้นสุดได้ง่าย แต่ฉันก็สงสัยว่าจะทำเช่นนี้ การป้องกันเต็มรูปแบบต่อสิ่งนี้เป็นไปไม่ได้แน่นอน


Meh เสียงกระเพื่อมทำให้การเขียนลูปไม่มีที่สิ้นสุดเวลารวบรวมง่ายเกินไป ตอนนี้ถ้าคุณมีจริงชนคอมไพเลอร์ ...
จอห์น Dvorak

@JanDvorak วิธีเดียวที่จะทำให้ Lisp ผิดพลาดได้คือการเรียกไลบรารี C ผ่าน FFI ;-)
coredump

@coredump โปรดทำ ณ เวลารวบรวม :-)
John Dvorak

(defmacro loop-forever () (loop)) (defun compile-me () (loop-forever))ควรจะเพียงพอ มันแฮงค์ CCL สำหรับฉัน
พี่เลี้ยง

3

PHP 5.3.1 (ล่าม Segfaults) ( Bug 50261 , แก้ไขใน 5.3.3)

   คลาส testClass
   {
       ฟังก์ชั่น testClass ()
       {
           echo 'เอาต์พุตสตริง!';
       }
   }

   คลาส testClass2 ขยาย testClass
   {
       ฟังก์ชั่น __ โครงสร้าง ()
       {
           call_user_func (array ('parent', '__construct'));
       }
   }

   ใหม่ testClass2;

อันนี้เป็นปัญหาเล็กน้อยเพราะรหัสข้างต้นเป็นเรื่องธรรมดาในรหัสที่ฉันทำงานด้วยทำให้มันเป็นปัญหาที่แพร่หลายสำหรับเรา

(ถ้าฉันจำได้อย่างถูกต้อง ณ จุดหนึ่งนี่เป็นวิธีเดียวที่จะเรียกผู้สร้างหลักใน PHP)


3

D

(DMD32 D Compiler v2.067.1, Windows build)

enum x = "mixin(x);";
mixin(x);

โปรดทราบว่าสิ่งนี้จะส่งคอมไพเลอร์เข้าสู่วงวนไม่สิ้นสุดและหยุดทำงาน

ข้อผิดพลาด: หน่วยความจำไม่เพียงพอ

หอยทากเชิงกลแนะนำว่าการเขียนโปรแกรมแบบรวบรวมเวลาใน D อาจถูกใช้เพื่อจุดประสงค์นี้ แต่วิธีการแก้ปัญหาอาจจะง่ายกว่าเทคนิคที่เขามีอยู่ในใจ


สำหรับผู้ที่ไม่คุ้นเคยกับ 'สตริงมิกซ์' มันเป็นคุณสมบัติมาโครที่ค่อนข้างตรงไปตรงมา เมื่อคอมไพเลอร์พบmixin("asdf")มันจะแทนที่ด้วยเนื้อหาของสตริงasdfและพยายามรวบรวมอีกครั้ง

การแก้ปัญหาข้างต้นจะถูกขยายเช่น:

mixin(x);  ->  mixin("mixin(x);");  ->  mixin(x);

ดังนั้นหากคอมไพเลอร์พยายามที่จะตรวจจับกรณีขยายตัวนี้มันจะเข้าสู่การวนรอบไม่สิ้นสุด


3

Perl

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

(โดยวิธีการเรียกซ้ำไม่สิ้นสุดตามปกติจะกินหน่วยความจำทั้งหมด แต่ด้วยการบรรทุกเกินพิกัดมันก็เกิดปัญหา)

package MyAmazingClass;
use 5.010;

use overload '+' => sub {
    my ($first, $second) = @_;
    return $first + $second;
};

sub new {
    my $self = shift;
    return bless {}, $self;
}

# BEGIN runs code at compile time
BEGIN {
    my $instance = MyAmazingClass->new;
    my $sum = $instance + $instance;
    say $sum;
}

เอาท์พุท:

fish: Job 1, 'perl' terminated by signal SIGSEGV (Address boundary error)

3

Simplex v.0.5 , 2 ไบต์

น่าเสียดายที่นี่ไม่ใช่ :

2Q

ให้ฉันอธิบาย จากเอกสาร:

[ Q] เพิ่มซอร์สโค้ดของโปรแกรมไปยังโปรแกรมด้านนอกจากจุดเริ่มต้น (ไม่รวมอักขระ! หากไบต์ปัจจุบันไม่เป็นศูนย์) หากไบต์เป็น 2 ให้ทำซ้ำคำสั่งปัจจุบันเช่นกัน

ดังนั้น:

2 ~~ Manhattan adds 2 to the current byte: 10*0 + 2 = 2.
Q ~~ Adds program source code to the outer program, with Q

โปรแกรมด้านนอกเป็นฟีเจอร์เล็ก ๆ น้อย ๆ ใน Simplex: ได้รับการประเมินในตอนท้ายของโปรแกรม ดังนั้นถ้าเราติดตาม ... :

P1  P2  P3  P4  ...
2Q->2Q->2Q->2Q->...

ในที่สุดความทรงจำก็จะหมดลงและโลกก็จะจบลง


3

เสียงดังกราว ++

ฉันเพิ่งเจอข้อบกพร่องที่สนุกนี้

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>

std::stringstream prog;

constexpr unsigned c_strlen( char const* str, unsigned count = 0 )
{
    return ('\0' == str[0]) ? count : c_strlen(str+1, count+1);
}

template < char t_c, char... tt_c >
struct rec_eval
{
    static void eval()
    {
        rec_eval<t_c>::eval();
        rec_eval < tt_c... > :: eval ();
    }
};
template < char t_c >
struct rec_eval < t_c >
{
    static void eval() {
        switch(t_c) {
            case '+':
                prog<<"++t[i];";
                break;
            case '-':
                prog<<"--t[i];";
                break;
            case '>':
                prog<<"++i;";
                break;
            case '<':
                prog<<"--i;";
                break;
            case '[':
                prog<<"while(t[i]){";
                break;
            case ']':
                prog<<"}";
                break;
            case '.':
                prog<<"putc(t[i],stdout);";
                break;
            case ',':
                prog<<"t[i]=getchar();";
                break;
        }
    }
};

template < char... tt_c >
struct exploded_string
{
    static void eval()
    {
        rec_eval < tt_c... > :: eval();
    }
};
template < typename T_StrProvider, unsigned t_len, char... tt_c >
struct explode_impl
{
    using result =
        typename explode_impl < T_StrProvider, t_len-1,
                                T_StrProvider::str()[t_len-1],
                                tt_c... > :: result;
};

template < typename T_StrProvider, char... tt_c >
struct explode_impl < T_StrProvider, 0, tt_c... >
{
     using result = exploded_string < tt_c... >;
};

template < typename T_StrProvider >
using explode =
    typename explode_impl < T_StrProvider,
                            c_strlen(T_StrProvider::str()) > :: result;


int main(int argc, char** argv)
{
    if(argc < 2) return 1;
    prog << "#include <stdio.h>\n#include <stdlib.h>\nint main(){unsigned char* t=calloc(";
    prog << (1 << sizeof(unsigned short));
    prog << ",sizeof(unsigned short));unsigned short i=0;";

    struct my_str_provider
    {
        constexpr static char const* str() { return "++++[>+++++<-]>+++[[>+>+<<-]>++++++[<+>-]+++++++++[<++++++++++>-]>[<+>-]<-]+++>+++++++++[<+++++++++>-]>++++++[<++++++++>-]<--[>+>+<<-]>>[<<+>>-]<-->>++++[<++++++++>-]++++++++++>+++++++++[>+++++++++++<-]>[[>+>+>+<<<-]>[<+>-]>>[[>+>+<<-]>>[<<+>>-]<[<->-[<->-[<->-[<->-[<->-[<->-[<->-[<->-[<->-[<<<+>---------->->[-]]]]]]]]]]]<]<<[>>++++++++++++[<++++<++++>>-]<<[.[-]>]<<]>[<++++++[>++++++++<-]>.[-]]<<<<<.<<<<<.[<]>>>>>>>>>.<<<<<..>>>>>>>>.>>>>>>>.[>]>[>+>+<<-]>[<+>-]>[-[[-]+++++++++[<+++++++++++++>-]<--.[-]>]]<<<<<.[<]>>>>>>>>>.>>>>>>>>>.[>]<<.<<<<<.<<<..[<]>>>>>>.[>]<<.[<]>>>>>>>>>.>.[>]<<.[<]>>>>.>>>>>>>>>>>>.>>>.[>]<<.[<]>.[>]<<<<<<.<<<<<<<<<<<..[>]<<<.>.[>]>[>+>+>+<<<-]>[<+>-]>>[[>+>+<<-]>>[<<+>>-]<[<->-[<->-[<->-[<->-[<->-[<->-[<->-[<->-[<->-[<<<+>---------->->[-]]]]]]]]]]]<]<<[>>++++++++++++[<++++<++++>>-]<<[.[-]>]<<]>[<++++++[>++++++++<-]>.[-]]<<<<<.<<<<<.[<]>>>>>>>>>.<<<<<..>>>>>>>>.>>>>>>>.[>]>[>+>+<<-]>[<+>-]>[-[[-]+++++++++[<+++++++++++++>-]<--.[-]>]]<<<<<.[<]>>>>>>>>>.>>>>>>>>>.[>]<<.<<<<<.<<<..[<]>>>>>>.[>]<<<<.>>>.<<<<.<.<<<<<<<<<<.>>>>>>.[>]<<.[<]>>>>>>>>>.>.>>>>>>>>>.[>]<<.<<<<<<<.[<]>>>>>>>>>.[<]>.>>>>>>>>>.[>]<<.<<<<.<<<<<<<<<<<<<.[>]<<<<<<<<<.[>]<<.[<]>>>>>>>>.[>]<<<<<<.[<]>>>>>..[>]<<.<<<<<<<<<<<<.[<]>>>>.[>]<<.<<<<.[<]>>>>>>.>>>.<<<<<<.>>>>>>>.>>>>>>>>>>.[>]<<<.>.>>>-[>+>+>+<<<-]>[<+>-]>>[[>+>+<<-]>>[<<+>>-]<[<->-[<->-[<->-[<->-[<->-[<->-[<->-[<->-[<->-[<<<+>---------->->[-]]]]]]]]]]]<]<<[>>++++++++++++[<++++<++++>>-]<<[.[-]>]<<]>[<++++++[>++++++++<-]>.[-]]<<[>+>+<<-]>[<+>-]+>[<->[-]]<[-<<<[<]>>>>>>>>>>.<.[>]<<.[<]>>>>>>>>>>>.<<.<<<.[>]<<<<<<<<<<.[>]>>]<<<<.<<<<<.[<]>>>>>>>>>.<<<<<..>>>>>>>>.>>>>>>>.[>]>[>+>+<<-]>[<+>-]+>[<->-[<+>[-]]]<[++++++++[>+++++++++++++<-]>--.[-]<]<<<<.[<]>>>>>>>>>.>>>>>>>>>.[>]<<.<<<<<.<<<..[<]>>>>>>.[>]<<.[<]>>>>>>>>>.>.[>]<<.[<]>>>>.>>>>>>>>>>>>.>>>.[>]<<.[<]>.[>]<<<<<<.<<<<<<<<<<<..[>]<<<<.>>>..>>]"; }
    };

    auto my_str = explode < my_str_provider >{};
    my_str.eval();

    prog << "}";

    std::ofstream ofs(argv[1]);
    if(!ofs) return 2;
    ofs << prog.str() << std::endl;
    ofs.close();

    return 0;
}

เป้าหมายคือการแปล Brainfuck เป็น C โดยใช้การเขียนโปรแกรม meta-template เพื่อทำงานส่วนใหญ่ รหัสนี้ใช้ได้กับโปรแกรม Brainfuck ขนาดเล็กเช่น Hello World แต่เมื่อฉันพยายามเรียกใช้ด้วย 99 ขวด ...

$ clang++ -std=c++11 -fconstexpr-depth=1000 bf_static.cpp
clang: error: unable to execute command: Segmentation fault (core dumped)
clang: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 3.5.2 (tags/RELEASE_352/final)
Target: i386-pc-windows-cygnus
Thread model: posix
clang: note: diagnostic msg: PLEASE submit a bug report to http://llvm.org/bugs/ and include the crash backtrace, preprocessed source, and associated run script.
clang: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /tmp/bf_static-afa982.cpp
clang: note: diagnostic msg: /tmp/bf_static-afa982.sh
clang: note: diagnostic msg:

********************

มันจะรวบรวมใน GCC สำเร็จ (หลังจากประมาณ 2 นาที) แต่การเชื่อมโยงทำให้เกิดปัญหาอื่น ...

/usr/lib/gcc/i686-pc-cygwin/4.9.3/../../../../i686-pc-cygwin/bin/as: /tmp/cc0W7cJu.o: 
section .eh_frame$_ZN8rec_eval<giant mangled name removed>: string table overflow at offset 10004228
/tmp/cc3JeiMp.s: Assembler messages:
/tmp/cc3JeiMp.s: Fatal error: can't close /tmp/cc0W7cJu.o: File too big

อุ่ย


3

Smalltalk (ภาษารับสารภาพรุ่น 4.x)

ง่ายมากเพียงแค่ประเมินผลนี้หรือยอมรับวิธีการด้วยตัวอักษรนี้

1.0e99999999999999999999

มันจะพยายามประเมินพลังของ 10 ในการคำนวณเลขจำนวนเต็มขนาดใหญ่เพียงสำหรับการปัดเศษ inf Tsss อย่างถูกต้อง;)

แก้ไข:จำเป็นต้องใช้ 9 จำนวนเท่าใด

เนื่องจาก 2 ^ 10 คือ 1024 ประมาณ 10 ^ 3 เราสามารถประมาณ 10 ^ n โดย 2 ^ (10 * n / 3) นั่นหมายความว่า 10 ^ n ต้องการ 10 บิต * n / 3 บิตเพื่อแสดงในไบนารี เราต้องการให้ 10 ^ n ไม่สามารถแทนได้

สมมติว่าตัวชี้ 32 บิตสำหรับหน่วยความจำวัตถุเรารู้ว่าเราไม่สามารถอยู่มากกว่า 2 ^ 32 ไบต์นั่นคือ 2 ^ 35 บิต ลองย้อนกลับปัญหา: 2 ^ 35 ประมาณ 32 * 2 ^ 30, 32 * 10 ^ 9 ต้องมีตัวเลขทศนิยม 11 หลักดังนั้นด้วย 11 ที่ 11 เรามั่นใจว่าจะสร้างข้อผิดพลาดใน 32bits Squeak ใน 64 บิตที่จะเป็นยี่สิบเอ็ด 9

นอกจากนี้เรายังสามารถใช้หน่วยความจำที่น้อยกว่า 9s พื้นที่ที่อยู่ทั้งหมดไม่จำเป็นต้องมี แต่มันช้ามากที่จะทดสอบ Squeak VM ไม่ได้รับการปรับให้เหมาะสมสำหรับเลขคณิตขนาดยักษ์ซึ่งแตกต่างจาก GMP


คุณต้องการมากกว่าสี่9หรือไม่?
Joe Z.

@JoeZ ใช่มากกว่า 4 Nines.Smalltalk มีเลขคณิตขนาดใหญ่และเครื่องมี RAM ขนาดใหญ่ในขณะนี้ ... การทดสอบขีด จำกัด ที่แน่นอนน่าเบื่อเหนือ 6 nines คอมไพเลอร์เริ่มเป็น sloooowwww
aka.nice

2

นี่เป็นวิธีดั้งเดิมและกระชับของฉันในการขัดข้อง GolfScript:

{1.}do

สิ่งนี้จะถูกตั้งค่าการวนซ้ำตลอดไปที่ยังคงผลัก 1 ไปยังกองซ้อนจนกว่าหน่วยความจำหมด

ใน C / C ++ ฉันเชื่อว่าโค้ดต้นฉบับนี้จะทำให้คอมไพเลอร์ขัดข้อง:

#define a bb
#define b aa
int main(){a}

นี่จะทำให้คอมไพเลอร์ติดเพิ่มจำนวนของ a และทำให้พวกมันกลายเป็น b's และในทางกลับกันดังนั้นคอมไพเลอร์ก็จะหมดหน่วยความจำและความผิดพลาดในไม่ช้า

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

:a
start %0
goto a

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

คนสุดท้ายคือระเบิด VBS มันเป็นระเบิดอีกลูกหนึ่งเหมือนระเบิดครั้งสุดท้าย แต่มันกลับเปิดกล่องโต้ตอบจำนวนอนันต์

set oshell = wscript.createobject("wscript.shell")
do
oshell.run "wscript " & wscript.scriptname
msgbox "blah"
loop

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

โปรดทราบว่าฉันมากับโปรแกรมเหล่านี้ทั้งหมดด้วยตัวเอง


1
มาโคร C ไม่สามารถเรียกคืนได้ คุณไม่สามารถขัดข้องตัวประมวลผลล่วงหน้า C หรือ C ++ ได้
Joshua

2

Common Lisp 8 ไบต์

สั้นกว่าคำตอบ Lisp ทั่วไปอื่น ๆ :-)

#.(loop)

วนรอบในขณะที่อ่านแบบฟอร์มของคุณ

มาตรฐาน Common LISP ไม่ได้กล่าวถึงวิธีพกพาที่จะทำให้มันพังดังนั้นฉันคิดว่าเราจำเป็นต้องมีวิธีที่กำหนดไว้ในการนำไปใช้ ยังคง 8 ไบต์:

#.(quit) ; ccl

... หรือ,

#.(exit) ; sbcl

เมื่อคุณโทร(compile-file "crash.lisp")สภาพแวดล้อม "ผิดพลาด" อย่างลึกลับ

ฉันยังคงพยายามหาวิธีที่จะทำให้สภาพแวดล้อมพังทลาย (และอีกไม่นาน) แต่ก็ยากมาก ทั้งหมดที่ฉันได้รับคือการมีปฏิสัมพันธ์ที่ดีกับดีบักเกอร์


2

x86 แอส

"nasm -v" ส่งคืน "NASM เวอร์ชัน 2.11.08 รวบรวมเมื่อวันที่ 21 กุมภาพันธ์ 2015" (ฉันใช้งานภายใต้ win7)

แอสเซมเบลอร์ทำงานอยู่ที่ 1:12:27 จนถึง i7 ซึ่งอิ่มตัวหนึ่งในแกนหลักทั้งหมด ไฟล์เอาต์พุตอยู่ที่ 0 ไบต์การใช้หน่วยความจำคงที่ที่ 1,004K - ดูเหมือนว่าปลอดภัยที่จะพูดว่าฉันหมดสติไปมากกว่าแค่ให้มันเป็นงานที่ยาวนานจริงๆ :)

กุญแจสำคัญในการหลอกลวงคือค่าซ้ำในแมโคร - 0xFFFFFFFF แม้ว่าฉันจะไม่คุ้นเคยเพียงพอกับเรื่องภายในของ Nasm ที่จะรู้ว่าทำไมมันถึงสำลักอย่างนี้ ฉันคาดว่าจะได้รับเอาต์พุต ~ 16GB เมื่อชั่วโมงที่แล้ว

%MACRO INVOKE 1-*
;  %REP    %0 - 1
  %REP     0xffffffff
    %ROTATE   -1
    PUSH    DWORD %1
  %ENDREP
  %ROTATE -1
  CALL    %1
%ENDMACRO

[section .text]
bits 32
org 0x10000

EntryPoint:
    INVOKE dword 666
    ret

แก้ไข: เพียงตรวจสอบตัวจัดการงาน Nasm ทำงานเป็นเวลา 7:40:41 และขณะนี้หน่วยความจำสูงถึง 1,016K


2

แอสเซมเบลอร์ Gnu สร้างไฟล์เอาต์พุตขนาดใหญ่

แมโครนี้พยายามเติมไฟล์เอาต์พุตด้วยขยะ (โดยปกติจะเป็นโมฆะไบต์) จนกว่าจะถึงขอบเขต 4 GB เพิ่ม int เพื่อให้ผ่านขอบเขตนั้นและเรียกตัวเองซ้ำ ๆ เพื่อให้การเติมเอาต์พุตด้วยขยะขนาด 4 GB สิ่งนี้จะเติมฮาร์ดไดรฟ์ของคุณจนกว่าจะเต็มซึ่งเป็นจุดที่แอสเซมเบลอร์อาจมีปัญหา

.macro f n #Define a macro named f, taking argument n.
.p2align 32 #Fill file with 0x00's until current address is divisible by 2^32
.long 0 #Add a long after the current address, throwing it off alignment.
.if \n #If n > 0, recursively tail-call itself, decrementing n.
f "(\n-1)"
.endif
.endm #End macro definition.
f 32 #Expand macro f, with n = 32 (output size 4GB*32 = 128GB)

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

การรวบรวมสามารถทำได้กับas -o crash.out crash.sการกระจาย Linux ส่วนใหญ่


คุณสามารถแสดงความคิดเห็นที่มา? ฉันไม่เข้าใจว่าสิ่งนี้กำลังทำอะไรอยู่
แมว

1
คุณควรโพสต์สิ่งนี้เป็นคำตอบสำหรับการสร้างคอมไพเลอร์ระเบิด ! : D
แมว

1

Common Lisp, 29 ไบต์

การใช้งาน: Clozure CL

คำเตือน:ระวังเมื่อใช้รหัสนี้มันอาจฆ่ากระบวนการที่คุณไม่ต้องการ!

#.(run-program"pkill"'("cl"))

สิ่งนี้จะรันคำสั่งเชลล์pkill clในเวลารวบรวมซึ่งจะฆ่ากระบวนการ Lisp ที่ทำการรวบรวม ไม่ใช่ความผิดพลาดทางเทคนิค แต่มีผลเหมือนกัน

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

$ cat /tmp/t.lisp
#.(run-program "pkill" '("cl"))
$ ccl -n
Welcome to Clozure Common Lisp Version 1.11-dev-r16513-trunk  (LinuxX8664)!

? (compile-file "/tmp/t.lisp")
#P"/tmp/t.lx64fsl"
NIL
NIL
?
zsh: terminated  ccl -n
$ 

1

เฟลิกซ์

มันไม่ทำงานอีกต่อไป แต่ ณ จุดหนึ่งรหัสนี้:

include "std/control/pchannels";

fun is_square(v: int) => let s = int$ sqrt$ v.float + 0.5f in s*s == v;
fun is_median(v: int) => v % 4 == 0 and (v/4).is_square;

struct Message { value: int; };

proc process(c: int, chan: pchannel[Message]) {
    var i = 0;
    for var b in (c+1)/2 upto c do
        for var a in c - b + 1 upto b do
            if is_median(2*(b*b+c*c)-a*a) or
               is_median(2*(a*a+c*c)-b*b) or
               is_median(2*(a*a+b*b)-c*c) do ++i; done;
        done
    done
    write(chan, Message i);
};

proc main() {
    n := int$ System::argv 1;
    var count = n;
    chan := #mk_pchannel[Message];
    var ntri = 0;

    for var c in 1 upto n perform spawn_pthread { process(c, chan); };

    while count > 0 do
        let v = chan.read in ntri += v.value;
        --count;
    done
    ntri.println;
}

main;

สิ่งนี้จะทำให้เกิดข้อผิดพลาดใหญ่:

inner_bind_expression raised Not_found [BUG] e=(&((main_mf_60270<60270> ())), (value v))

ความล้มเหลวของระบบ bind_expression 'ยก Not_found [BUG] การรวบรวมเฟลิกซ์ "/ สื่อ / ไรอัน / เนื้อหา / เฟลิกซ์ / สร้าง / เผยแพร่ / โฮสต์ / ถัง / flxg" "-q" "--optimise" "--inline = 100" "- output_dir = / home / ryan / stuff / .felix / text "" --cache_dir = / home / ryan / stuff / .felix / cache "" -I / media / ryan / stuff / felix / build / release / share / lib "" -I / media / ryan / stuff / felix / build / release / host / lib "" --syntax=@/media/ryan/stuff/felix/build/release/share/lib/grammar/grammar.files " "--automaton = / home / ryan / stuff / .felix / แคช / สื่อ / ryan / stuff / felix / build / release / share / lib / ไวยากรณ์ / grammar.files / syntax.automaton" "--import = plat / flx.flxh "" std "" /home/ryan/golf/itri/sl.flx "ล้มเหลวข้อผิดพลาด 1 ใน flx: [strerror_r] ล้มเหลวในการค้นหาข้อความสำหรับหมายเลขข้อผิดพลาด 1

ปัญหาอยู่ที่นี่:

let v = chan.read in ntri += v.value;

letคาดว่านิพจน์จะติดตามมัน แต่ฉันใส่คำสั่งแทน ดังนั้นคอมไพเลอร์ก็หลุดออกมาเล็กน้อย

ข้อมูลเพิ่มเติมได้ที่https://groups.google.com/forum/m/#!topic/felix-language/J3Hs4j6E0gM


1

JavaScript

while (true === true){
console.log(0);
}

สิ่งนี้จะส่งมันเป็นวงไม่สิ้นสุด ฉันใช้คอมไพเลอร์ Codecademy JS และทำให้เบราว์เซอร์ของฉันขัดข้อง


1
นั่นคือคอมไพเลอร์หรือรันไทม์ crashing? เว็บเบราว์เซอร์นั้นมีทั้งคู่ แต่ฉันก็เถียงว่ามันยังแยกส่วนประกอบอยู่
Hand-E-Food

คอมไพเลอร์ขัดข้องเบราว์เซอร์ของฉันค้าง @ Hand-E-Food
juniorRubyist

1
นี่ไม่ใช่การคอมไพล์แปล; มันกำลังแขวนเว็บเพจของคุณ นอกจากนี้คุณสามารถเขียนwhile(1){}; นี่เป็นลูปไม่สิ้นสุด
SirPython

while(1);ตัวอย่างแม้สั้นคือ
Aplet123

1

จาวาสคริ

function crash(){
  window.location.hash=Math.random(),onhashchange=function(){crash()}
}

สิ่งนี้ทำให้เว็บเบราว์เซอร์ขัดข้องอย่างมีประสิทธิภาพ ใช้ความเสี่ยงของคุณเอง !!!


3
การชนที่แม่นยำหมายถึงอะไร โดยเฉพาะคำถามนี้เกี่ยวกับคอมไพเลอร์ที่ล้มเหลวและดูเหมือนว่ามันจะทำให้เบราว์เซอร์ตายไม่ใช่คอมไพเลอร์ภายใน JS
Petr Pudlák

FF ปฏิเสธที่จะผิดพลาด ใช้งานใน Chrome ทำให้ระบบของฉันหยุดทำงาน
แมว

1

ฮัสเซียม

File1.has:

use "File2.has";

File2.has:

use "File1.has";

สิ่งนี้ทำให้ Hassium โหลดและเริ่มรวบรวม File2.has ซึ่งบอกให้โหลด File1.has ซึ่งทำให้โหลด File2.has และอื่น ๆ


0

LOLCODE 1.2, LOLCODE Common Interpreter / Compiler (lci)

ฉันรู้ว่านี่ไม่ใช่แต่มันสั้นมาก ๆ

OBTW

สิ่งนี้ทำให้เกิดสัญญาณ 11:

Segmentation fault (core dumped)


ทำไม? HAI1.2หมายถึงการเริ่มต้นของโปรแกรมและOBTWเริ่มต้นความคิดเห็นหลายบรรทัด แต่คอมไพเลอร์คาดว่าKTHXBYEจะปิดHAIและ a TLDRเพื่อปิดความคิดเห็นหลายบรรทัด

โปรดทราบว่าสิ่งนี้จะยังคงทำงานเพื่อก่อให้เกิด segfault ด้วยสิ่งอื่นนอกเหนือจากTLDRหลังจากOBTWนั้น

(มาจากวิกิพีเดียของมาตรฐาน LOLCODE เป็นเพียง Weirdlang ไม่ลับจริง.)
คุณสามารถคว้าล่ามจากคอมไพล์ / justinmeza / LCI


"ใช้ภาษามาตรฐานที่ใช้ในโลกแห่งความเป็นจริง" คุณหมายถึงบอกฉันหรือไม่ว่าคุณใช้ lolcode เพื่อเขียนโปรแกรมที่ถูกกฎหมาย?
Patrick Roberts

@PatrickRoberts ใช่ฉันต้องการ / s
ตบมือ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.