좋아하는 컴파일러 충돌


44

컴파일 할 때 컴파일러에서 충돌이 발생하거나 무한 루프 (무한 컴파일 시간)로 보내는 적절한 언어로 완벽하게 유효한 코드를 작성하십시오.

제한 사항 :

  • 실제 세계에서 사용되는 표준 언어를 사용하십시오.
  • 잘 개발 된 표준 컴파일러를 사용하십시오 ( "모든 것에 충돌하는 C 컴파일러를 작성했습니다").
  • 코드는 언어에서 합법적이어야합니다 (따라서 컴파일러 나 언어 버그를 이용해야 할 것입니다).
  • 다른 사람이 복제 할 수 있도록 컴파일러 버전과 옵션을 제공하십시오.
  • 가능한 경우 컴파일러가 충돌 한 이유를 설명하십시오.

재미있게 보내세요 :)


4
"충돌"의 의미에 대해 자세히 설명해 주시겠습니까?
Mr. Llama

@GigaWatt 나는 컴파일러가 방해받지 않고 멈추는 것을 의미합니다. 입력을 성공적으로 컴파일하거나 오류 메시지를 발행하지 않습니다. segfault 처럼 모든 메모리를
잡아

1
이 콘테스트는 주로 테스트 사례에 대한 버그 보고서를 검색하는 연습입니다 : /
Sparr

1
통역사 충돌이 허용됩니까?
Mark

1
다시 열도록 투표하십시오!
noɥʇʎԀʎzɐɹƆ

답변:



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
답을 얻기 위해 겪은 문제에 대해 +1 : P
UnkwnTech

4
@UnkwnTech :-) 실제로 재귀 데이터 형식 만 사용하여 재귀를 구현하려고 할 때 우연히이 사실을 발견했습니다.
Petr Pudlák

18

이것은 의존적으로 유형이 지정된 언어 에서 쉽습니다 . 형식 검사 일반 종속 형식은 임의로 복잡한 계산이 필요할 수 있으므로 결정 불가능합니다 (Turing-complete). 종속 유형으로 너무 큰 값을 간단히 인코딩 할 수 있습니다. 그런 다음 형식 검사기는 사용 가능한 모든 메모리를 사용하고 충돌합니다. 예를 들어, 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>

이것을 억만 웃음 공격 이라고합니다 .


4
<lolz>&lol999;</lolz>10 ^ 999 웃음이 아닌 억원이다. 연결된 참조 <lolz>&lol9;</lolz>는 실제로 10 억인을 사용합니다.
mbomb007

Coq 문제는 Turing 완전 성과는 아무런 관련이 없습니다. Coq의 타입 시스템은 타입 확인 결정 가능하고 Turing이 완료되지 않도록 특별히 설계되었습니다 . 일정한 양의 메모리를 사용하면 유형 검사가 항상 가능하지만 항상 종료됩니다. 그러나 상수는 문제의 코드에 따라 달라지며 임의로 커질 수 있습니다.
존 콜 랜두 오니

18

씨#

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하십시오. 이것은 선의 힘을 위해서만 사용할 장난입니다.
Mark

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

이것이 왜 작동하는지에 대한 간단한 설명을 얻을 수 있습니까?
Mr. Llama

1
@GigaWatt, 여기 에서 좀 더 자세히 설명 하지만 IDE가 오류 (예기치 않은 기호 ,및 예상 ,)에 대처할 수없는 것으로
보입니다.

6

펄 (15)

BEGIN{1while 1}

컴파일 타임에 무한 루프가 생성 됩니다 .

BEGIN 코드 블록은 가능한 빨리, 즉 나머지 포함 파일 (또는 문자열)이 구문 분석되기 전에 완전히 정의 된 순간에 실행됩니다.

( perlmod에서 )

이것이 바로 Perl이 코드 구문 분석을 완료 할 수없는 이유입니다. 이것은 끝나지 않습니다 :

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

5

제이

이것은 J 인터프리터를 segfault합니다 (적어도 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자를 깎을 수 있습니다.
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, 프로그래밍 퍼즐 및 코드 골프 스택 교환에 오신 것을 환영합니다. 도움이 필요하거나 대화하고 싶은 분은로이 의견에 자유롭게 답하십시오 @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. Lisp는 컴파일 타임 무한 루프 작성을 너무 쉽게 만듭니다. 만약 당신이 실제로 컴파일러에 충돌을 일으킨다면 ...
John Dvorak

리스프 충돌 할 수있는 유일한 방법을 @JanDvorak은 ;-) FFI를 통해 C 라이브러리를 호출하는 것입니다
코어 덤프

@coredump하십시오. 컴파일 타임 :-)
John Dvorak

(defmacro loop-forever () (loop)) (defun compile-me () (loop-forever))충분해야합니다. 그것은 나를 위해 CCL을 중단합니다.
nanny

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

(DMD32 D 컴파일러 v2.067.1, Windows 빌드)

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

이렇게하면 컴파일러가 무한 루프 보내져 충돌이 발생합니다.

오류 : 메모리 부족

Mechanical snail D의 컴파일 타임 프로그래밍 기능이 이러한 목적으로 남용 될 수 있다고 제안 했지만 솔루션은 아마도 그가 생각했던 기술보다 간단 할 것입니다.


'문자열 믹스 인'에 익숙하지 않은 사람들에게는 상당히 간단한 매크로 기능입니다. 컴파일러가을 만나면 mixin("asdf")이를 문자열의 내용 asdf으로 바꾸고 다시 컴파일하려고합니다.

위의 솔루션은 다음과 같이 확장됩니다.

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

따라서 컴파일러가 이와 같은 확장 사례를 감지하지 않으면 무한 확장 루프가 시작됩니다.


3

컴파일 타임에 연산자 오버로드를 정의하고 컴파일시 코드를 실행하여 클래스의 인스턴스를 함께 추가합니다.

(일반적으로 무한 재귀는 모든 메모리를 소비하지만 과부하로 인해 충돌이 발생합니다)

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] 처음부터 프로그램 소스 코드를 외부 프로그램에 추가합니다 (현재 바이트가 0이 아닌 경우! 문자 제외) 바이트가 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로 변환하는 것입니다. 이 코드는 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:

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

약 2 분 후에 GCC에서 성공적으로 컴파일되지만 링크하면 다른 문제가 발생합니다 ...

/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

스몰 토크 (Squeak dialect, version 4.x)

아주 쉽게, 이것을 평가 하거나이 리터럴로 메소드를 수락하십시오.

1.0e99999999999999999999

inf Tsss를 올바르게 반올림하기 위해 Large Integer 산술에서 10의 거듭 제곱을 평가하려고 시도합니다.)

편집 : 얼마나 많은 9가 필요합니까?

2 ^ 10은 약 10 ^ 3 인 1024이므로 대략 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 개 9 개를 사용하면 32 비트 Squeak에서 오류가 발생합니다. 64 비트에서는 21이됩니다.

또한 9s 미만으로 메모리를 소진 할 수 있으며, 전체 주소 지정 가능 공간을 반드시 사용할 수있는 것은 아니지만 테스트 속도가 매우 느리며 Squeak VM은 GMP와 달리 이러한 거대한 산술에 최적화되어 있지 않습니다.


네 개 이상이 필요하십니까 9?
Joe 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의 양을 두 배로 늘리고 b로 바꾸고 그 반대의 경우도 마찬가지이므로 컴파일러는 곧 메모리 부족과 충돌이 발생합니다.

다른 하나는 배치 스크립트 자체가 아니라 컴퓨터를 완전히 정지시키는 경우 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

공통 리스프, 8 바이트

다른 일반적인 Lisp 답변보다 짧음 :-)

#.(loop)

양식을 읽는 동안 반복하십시오.

커먼 리스프 (Common Lisp) 표준은 충돌을 일으키는 휴대용 방법에 대해 언급하지 않았으므로 구현 정의 방식이 필요하다고 생각합니다. 여전히 8 바이트 :

#.(quit) ; ccl

... 또는

#.(exit) ; sbcl

를 호출 (compile-file "crash.lisp")하면 환경이 신비하게 "충돌"됩니다.

농담으로, 나는 여전히 환경을 실제로 (그리고 곧) 추락시키는 방법을 찾으려고 노력하고 있지만 실제로는 어렵습니다. 내가 얻는 것은 디버거와의 훌륭한 상호 작용입니다.


2

x86 asm

"nasm -v"는 "2015 년 2 월 21 일에 컴파일 된 NAS 버전 2.11.08"을 반환합니다 (win7에서 실행 중).

어셈블러는 지금까지 i7에서 1:12:27로 실행되어 코어 중 하나를 완전히 포화시킵니다. 출력 파일은 0 바이트에 있고 메모리 소비는 1,004K로 안정적입니다. 실제로 정말 긴 작업을 수행하는 것보다는 nasm을 두들겨 놓은 것이 안전합니다. :)

트릭의 핵심은 매크로의 반복 값-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 어셈블러

이 매크로는 4GB 경계에 도달 할 때까지 출력 파일을 가비지 (일반적으로 널 바이트)로 채우려 고 시도하고, 해당 경계를 넘어서도록 int를 추가하고, 4GB 청크의 가비지로 출력을 계속 채우기 위해 자체적으로 호출합니다. 하드 드라이브가 가득 찰 때까지 하드 드라이브를 채우면 어셈블러가 충돌 할 수 있습니다.

.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

공통 리스프, 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] Felix 컴파일 "/ media / ryan / stuff / felix / build / release / host / bin / flxg" "-q" "--optimize" "--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

자바 스크립트

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

이것은 무한 루프로 보냅니다. Codecademy JS 컴파일러를 사용했는데 브라우저가 다운되었습니다.


1
컴파일러 또는 런타임이 충돌합니까? 웹 브라우저에는 둘 다 포함되어 있지만 여전히 별도의 구성 요소라고 주장합니다.
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

Hassium

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을 닫습니다 HAI, 그리고는 TLDR여러 줄의 코멘트를 닫습니다.

이것은 여전히 TLDRafter 이외의 다른 것으로 segfault를 발생 시키게됩니다 OBTW.

( wikipedia의 표준에 따르면 LOLCODE는 실제로 난해한 것이 아니라 단지 Weirdlang입니다.) git / justinmeza / lci
에서 인터프리터를 가져올 수 있습니다 .


"실제 세계에서 사용되는 표준 언어를 사용하십시오." 당신은 합법적 인 프로그램을 작성하기 위해 lolcode를 사용할 것이라고 말하고 있습니까?
Patrick Roberts

@PatrickRoberts 네, 그렇습니다. / s
박수 :
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.