お気に入りのコンパイラをクラッシュさせる[終了]


44

適切な言語で完全に合法なコードを作成し、そのコンパイルによりコンパイラがクラッシュするか、無限ループ(無限コンパイル時間)になります。

制限事項:

  • 現実の世界で使用されている標準言語を使用します。
  • 標準のよく開発されたコンパイラを使用します(「すべてでクラッシュするCコンパイラを作成した」などの回答はありません)。
  • コードはその言語で合法でなければなりません(そのため、ほとんどの場合、コンパイラーまたは言語のバグを悪用する必要があります)。
  • 使用するコンパイラのバージョンとオプションを指定して、他の人が複製できるようにします。
  • 可能であれば、コンパイラがクラッシュした理由を説明してください。

楽しんで :)


4
「クラッシュ」とはどういう意味ですか?
ラマ氏

@GigaWattコンパイラが意図しない方法で停止することを意味します。入力を正常にコンパイルすることも、エラーメッセージを発行することもできません。それは次のように、実際にクラッシュすることがあるセグメンテーション違反などチェックされない例外を投げ、すべてのメモリを食べて、
ペトルスキー-パドラック

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.hsghc Bad.hs無限にループします。GHC 7.4.1 ghc -O2 Bad.hsは、実行されると無限にループします。

説明: omega無限再帰を使用して定義されます(任意のタイプに生息できる唯一の方法)。コンパイラのxxインライナーは、単純で非再帰的な関数と見なされるため、の定義でインライン化しようとしomegaます。結果はになり(\x@(C x') -> x' x) (C xx)ます。コンパイラーは、コンストラクターでパターン一致を検出すると、それを削減しようとし、xx (C xx)再び取得してループします。トリックはxx実際には再帰的ですが、再帰はデータ型内に隠されています。

注:パズルを書いている間、GHCを無限ループで実行したままにしておくのを忘れていました。それはすべての記憶を奪い、Firefoxをクラッシュさせ、ハードリセットなしでやっとそれを殺すことができました。


5
答えのためにあなたが
経験

4
@UnkwnTech :-)実際、再帰データ型のみを使用して再帰を実装しようとしたときに、偶然にこれを発見しました。
ペトルスキー-パドラック

18

これは、依存型の言語であれば簡単です。一般的な依存型の型チェックは、任意の複雑な計算(チューリング完全)を必要とする可能性があるため、決定できません。依存型で大きすぎる値を単純にエンコードできます。その後、タイプチェッカーは使用可能なすべてのメモリを使用してクラッシュします。たとえば、Coqでは、ReyCharlesがの例を示していますCompute 70000.。これにより、タイプチェッカーがPeanoの巨大な数字を作成してクラッシュします。

ある種のマクロ展開またはメタプログラミングをサポートするより一般的な言語では、同様のことができます。たとえば、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>

これは10億笑い攻撃と呼ばれます。


4
<lolz>&lol999;</lolz>10億ではなく10 ^ 999の笑いであることに注意してください。リンクされた参照は<lolz>&lol9;</lolz>、実際には10億を使用します。
mbomb007

Coqの問題はチューリングの完全性とは関係がないことに注意してください。Coqの型システムは、型チェック決定可能であり、チューリング完全ではないように特別に設計されています。型チェックは常に一定量のメモリで可能です(そして常に終了します)が、その定数は問題のコードに依存しており、任意に大きくすることができます。
ジョンコランドゥオーニ

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
Visual Studioのインテリセンスが利用可能なメモリをすべて消費し、IDEをクラッシュさせるための+1。これは私が善の力のためだけに使用するいたずらです。
マーク

15

VBA

コードを入力してIDEをクラッシュできる場合はどうですか?

Microsoft Officeアプリケーションでは、これを試してください。

ALT+ F11VBAウィンドウにアクセスするには、次のコードを試してください

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

そして見よ:

エクセルデス

redim preserve v(,1 to 5)イミディエイトウィンドウに入力するだけで、ENTER!を押すとクラッシュします。


良いが、「お気に入りのインタープリターをクラッシュさせる」ようなもの
-mbx

これがなぜ機能するのか簡単に要約してもらえますか?
氏ラマ

1
@GigaWatt、ここでもう少し詳しく説明しますが、IDEはエラー(予期しないシンボル,と予期される,)に対処できないよう
です-SeanC

6

Perl(15)

BEGIN{1while 1}

これにより、コンパイル時に無限ループが作成されます

BEGINコードブロックは、できるだけ早く実行されます。つまり、含まれているファイル(または文字列)の残りが解析される前であっても、完全に定義された瞬間に実行されます。

perlmodから)

それが、Perlがコードの解析を完了できない理由です。これは終了しません:

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

5

J

これにより、Jインタープリターが(少なくともLinuxで)セグメンテーション違反になります。

15!:1[3#2

メモリアドレス2から読み取ろうとします。興味深いことに、0または1で試してみると、が得られdomain errorます。


5

TeX

\def\x{\x}\x

TeXはマクロ拡張言語です。ここでは、マクロの展開を定義\xすること\xを再度、その後、私たちは、その後の呼び出しを追加します\x。TeXは、に置き換え\xられて無限にスタックし\xます。


2
注:これは、これを実現する最短の方法ではありません。TeXには「アクティブな文字」という概念がありますが、これは基本的にマクロ名として扱われる文字です。したがって、これから3文字を削ることができます。
ハメライト

5

スキーム

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

私のコンパイラ、Chickenは、「実行時のパフォーマンス」などのためにコンパイル時にマクロを展開しようとするミスを犯しました。それで、これを拡張する代価を払った。R5RSを読みました。コンパイル時にマクロを拡張する必要があると言う人はいませんでした。

基本的に、マクロは無限のサイズの式に展開され、サイズは常に倍になります。まあ、技術的には、他のすべての拡張を2倍にします。コンパイラの運命は封印されています。少なくとも私のシステムでは、Chickenは2GBで上限を設定し、ガベージコレクションを試みて長時間停止し、ガベージコレクタが停止した後にクラッシュします。しかし、計算上高価な衛生魔法が発生するため、しばらく時間がかかります。

フォームの式を切り替える

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

そして

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

以下と比較して、メモリ消費率を非常に劇的に増加させるようです。

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

Chickenは、構文表現の詳細な分析を回避できるいくつかの方法を備えたかなり丈夫なコンパイラであると思われますが、私の最終的なソリューションでは、パターンマッチャーを実際に飛び込ませます。


わあ +1、およびプログラミングパズルとCode Golf Stack Exchangeへようこそ。ヘルプが必要な場合、または単に話したい場合は、このコメントに気軽に返信してください@wizzwizz4
wizzwizz4

3

Common Lisp

マクロを使用すると簡単になります。

(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の実装を使用して機能するはずです。ただし、非常に賢く、単純な無限ループを検出できる場合を除きますが、これを行うことは真剣に疑います。もちろん、これに対する完全な保護は不可能です。


あー Lispを使用すると、コンパイル時の無限ループを簡単に作成できます。あなたは、実際には、コンパイラ...墜落した今ならば
ジョン・ドヴォルザーク

@JanDvorak Lispをクラッシュさせる唯一の方法は、FFIを介してCライブラリを呼び出すことです;
coredump

@coredumpしてください。コンパイル時:-)
ジョンドヴォルザーク

(defmacro loop-forever () (loop)) (defun compile-me () (loop-forever))十分なはずです。CCLがハングアップします。
ナニー

3

PHP 5.3.1(Segfaultsインタープリター)(バグ50261、5.3.3で修正)

   クラスtestClass
   {
       関数testClass()
       {
           echo '出力文字列!';
       }
   }

   クラスtestClass2はtestClassを拡張します
   {
       関数__construct()
       {
           call_user_func(array( 'parent'、 '__construct'));
       }
   }

   新しいtestClass2;

上記のコードは私が作業していた多くのコードで一般的であったため、これは少し問題でした。

(正しく思い出せば、ある時点でこれがPHPで親コンストラクタを呼び出す唯一の方法でした。)


3

D

(DMD32 Dコンパイラv2.067.1、Windowsビルド)

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

シンプレックス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

外側のプログラムは、シンプレックスのすてきな小さな機能です。プログラムの最後で評価されます。したがって、追跡する場合...:

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

最終的には、メモリが不足し、世界が終了します。


3

Clang ++

この楽しいバグに出会いました。

#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に変換することです。このコードは、Hello Worldなどの小規模なBrainfuckプログラムで機能しますが、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(Squeakダイアレクト、バージョン4.x)

非常に簡単、これを評価するか、このリテラルのメソッドを受け入れる

1.0e99999999999999999999

inf Tsssを正しく丸めるために、ラージ整数演算で10のべき乗を評価しようとします;)

編集:いくつの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桁の10進数が必要であるため、11 9を使用すると、32ビットのSqueakでエラーが発生します。64ビットでは、21になります9。

また、9秒未満でメモリを使い果たすこともできます。アドレス指定可能な領域全体が必ずしも使用可能であるとは限りませんが、テストに致命的なほど時間がかかります。


4 9秒以上必要ですか?
ジョーZ.

@JoeZ。はい以上4 nines.SmalltalkはLargeInteger演算とマシンは、6つのナインの上、正確な制限は退屈だテスト...今、大きなRAMを持っているsloooowwwwことを始めるコンパイラがある
aka.nice

2

これは、GolfScriptをクラッシュさせるためのオリジナルで簡潔な方法です。

{1.}do

これが行うことは、メモリがなくなるまでスタックに1をプッシュし続ける永久ループを設定することです。

C / C ++では、この元のコードがコンパイラをクラッシュさせると信じています。

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

これにより、コンパイラはaの量を2倍にし、それらをbに、またはその逆に変換するため、コンパイラはすぐにメモリ不足になり、クラッシュします。

もう1つは、バッチスクリプト自体ではなく、コンピューターを完全にフリーズする場合のWindowsのバッチ用です。次を入力する必要があります。

:a
start %0
goto a

これは、自分自身のコピーを作成する無限ループに入り、自分自身のコピーなどを作成します。この小さなコードを実行した場合、これはおそらくコンピュータをクラッシュさせるでしょう。

最後の1つはVBS爆弾です。これは最後の爆弾のような別の爆弾ですが、代わりに無限のダイアログボックスを開きます。

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

これにより、自身のコピーが継続的に作成され、無限ループでメッセージボックスが開きます。これはクローンでも同様です。これらの最後の2つのプログラムを実行すると、コンピューターがフリーズし、コンピューターをハードブートする必要があるため、お勧めしません。

これらのプログラムはすべて自分で考え出したことに注意してください。


1
Cマクロは再帰しません。その方法でCまたはC ++プリプロセッサをクラッシュさせることはできません。
ジョシュア

2

Common Lisp、8バイト

他のCommon Lispの回答よりも短い:-)

#.(loop)

フォームを読みながらループします。

Common Lisp標準は、それをクラッシュさせるポータブルな方法について言及していないため、実装定義の方法が必要だと思います。まだ8バイト:

#.(quit) ; ccl

... または、

#.(exit) ; sbcl

を呼び出す(compile-file "crash.lisp")と、環境が不可解に「クラッシュ」します。

冗談を言って、私はまだ環境を(そしてすぐに)本当にクラッシュさせる方法を見つけようとしていますが、それは本当に難しいです。私が得るのは、デバッガとの素晴らしい相互作用です。


2

x86 asm

「nasm -v」は、「2015年2月21日にコンパイルされたNASMバージョン2.11.08」を返します(win7で実行しています)。

これまで、アセンブラはi7上で1:12:27で実行され、コアの1つを完全に飽和させました。出力ファイルは0バイトであり、メモリ消費は1,004Kで安定しています。実際に非常に長いタスクを与えるのではなく、私がnasmを破ったと言っても安全です。:)

トリックの鍵は、マクロ内の繰り返し値-0xFFFFFFFFです。ただし、Nasmの内部構造について十分に詳しくないので、なぜこれが首をかしげているのかがわかりません。1時間前に最大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の境界に達するまで出力ファイルをガベージ(通常はnullバイト)で埋めようとし、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
Build a compiler bombへの回答としてこれを投稿してください!: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))

SYSTEM FAILURE bind_expression 'raised Not_found [BUG] Felixコンパイル「/ media / ryan / stuff / felix / build / release / host / bin / 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 / cache / media / ryan / stuff / felix / build / release / share / lib / grammar / grammar.files / syntax.automaton" "--import = plat / flx.flxh "" std "" /home/ryan/golf/itri/sl.flx "はflxでエラー1に失敗しました:[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
コンパイラまたはランタイムがクラッシュしていますか?Webブラウザーには両方が含まれていますが、それらはまだ別個のコンポーネントであると主張します。
Hand-E-Food

コンパイラがクラッシュし、ブラウザがフリーズしました。@ Hand-E-Food
juniorRubyist

1
これはコンパイラをクラッシュさせません。ウェブページがハングアップしています。また、次のように書くこともできますwhile(1){}。これも無限ループです。
SirPython

さらに短い例はwhile(1);です。
Aplet123

1

Javascript

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

これにより、Webブラウザーが非常に効果的にクラッシュします。自己責任!!!


3
クラッシュの正確な手段は何ですか?特に、この質問はコンパイラーのクラッシュに関するものであり、これはブラウザーのJS内部コンパイラーではなく、単にブラウザーを死なせるだけのようです。
ペトルプドラク

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共通インタープリター/コンパイラー(lci)

私はこれがはないことを知っていが、とにかく非常に短いです。

OBTW

これにより、シグナル11が発生します。

Segmentation fault (core dumped)


どうして?HAI1.2はプログラムの開始を示し、OBTW複数行のコメントを開始します。ただし、コンパイラは、KTHXBYEを閉じてHAITLDR複数行コメントを閉じることを期待しています。

これは、TLDRafter 以外のセグメンテーション違反を引き起こすように機能することに注意してくださいOBTW

ウィキペディアの標準では、LOLCODEは単なる奇妙なものであり、実際には難解ではありません。) git / justinmeza / lci
からインタープリターを取得できます。


「実世界で使用されている標準言語を使用してください。」lolcodeを使用して正規のプログラムを作成すると言っているのですか?
パトリックロバーツ

@PatrickRobertsはい、そうです。/ s
拍手
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.