SIGSEGV를 발생시키는 가장 짧은 코드


답변:


113

C, 5 자

main;

변수 선언입니다. int유형이 암시되고 (B 언어에서 복사 된 기능) 0기본값입니다. 실행될 때 숫자를 실행하려고 시도하고 (숫자는 실행 불가능합니다) SIGSEGV.

온라인으로 사용해보십시오!


5
@Macmade : 실제로는 0입니다. static변수는 다음과 같이 시작 0하고 main;있다 static내가 외부 함수를 선언. c-faq.com/decl/initval.html
Konrad Borowski

16
마지막 으로이 일을 할 때 segfault에 다른 이유가 있음을 알았습니다. 우선 주요 호출하여 당신이 메인이 아닌 값의 위치로 이동, 다른 일이되어 main있는 int, 그것은에 위치하고 있습니다 .bss일반적으로 기능의 위치, .text커널이가 실행 페이지를 생성하는 ELF 프로그램을로드 할 때, .text비를 대한 -executable .bss주요 호출하여, 그래서 당신은 비 실행 페이지로 이동하고, 같은 페이지에 실행 뭔가가 보호 오류입니다.
nini

23
그렇습니다, C의 segfaults는 거의 기본값입니다 : P
Paul Draper

1
main __attribute__((section(".text#")))=0xc3;FTFY (적어도 x86에서 충돌하지 않고 돌아 오는 것처럼 보입니다).
jozxyqk

2
@jozxyqk 또는 더 짧습니다 const main=195;. 흥미로운 것은 그것이 작동한다는 것입니다.이 코드 골프 도전의 목표는 작동하지 않는 코드를 segfault로 만드는 것입니다. :).
Konrad Borowski

74

배쉬, 11      

kill -11 $$

44
11 자 신호 11 자 합법적 인 것 같습니다.
nyuszika7 시간

12
@ nyuszika7h 난 당신의 의견을 찬성하려고했지만 지금 당신은 11 개의 찬성 투표를했습니다, 그래서 나는 그것을 남겨 둘 것입니다. : P
HyperNeutrino

3
@AlexL. 다른 사람들은 그것을 망친 것 같습니다 :(
theonlygusti

2
@theonlygusti 그래 ... 너무 나쁘다. :( 오, 그럼 이제
찬성

2
최대 42 개의 공감대, 감동 자 없음!
seadoggie01

39

어셈블리 (Linux, x86-64), 1 바이트

RET

이 코드는 segfault입니다.


7
MSDOS .com 파일로서 오류없이 실행되고 종료됩니다.
JB

10
내 요점은 "어셈블리"를 지정하는 것만으로는 충분하지 않습니다.
JB

52
@JB : MS DOS에서 어떤 프로그램이됩니다 세그먼트 오류를 생성하지 않습니다. MS DOS는 메모리 보호가 존재하지 않는 리얼 모드에서 실행되기 때문입니다.
celtschk

1
@celtschk IIRC NTVDM은 존재하지 않는 주소와 MS-DOS에 할당되지 않은 주소에서 발생합니다.
ζ--

2
@celtschk : 어쨌든 다음과 같이 segfault 할 수 있습니다 : mov bx, 1000h; shr ebx, 4; mov eax, [ebx]-> CPU는 기본 SEGV를 높입니다 (아파 크는 처리 할 사람이 없습니다).
Joshua

26

파이썬 2, 13

exec'()'*7**6

Windows는 c00000fd (스택 오버플로) 오류 코드를보고합니다.이 오류는 세그먼테이션 오류의 하위 유형이라고 가정합니다.

Alex A.와 Mego 덕분에 Mac 및 Linux 시스템에서도 세그먼테이션 오류가 발생하는 것으로 확인되었습니다. Python은 프로그램을 이식 가능하게 충돌시키는 데 사용되는 언어입니다.


7
Segmentation fault: 11Mac에서
Alex A.

7
Segmentation fault (core dumped)Linux에서
Mego

이게 먼저 끊어 집니까?
Mega Man

1
@MegaMan 마치는 데 오랜 시간이 걸립니까? 아니요, 7 ** 6은 약 100K에 불과하므로 지각 가능한 지연이 없습니다.
feersum

왜 이것이 작동합니까? Mac OS의 Python 3.6.8에서는 보이지 않습니다.
Max Gasner

22

pdfTeX (51)

\def~#1{\meaning}\write0{\expandafter~\string}\bye

이것은 실제로 버그 일지 모르지만 Knuth가 작성한 원래 TeX에는 존재 하지 않습니다. tex filename.tex대신 코드를 컴파일 pdftex filename.tex해도 segfault가 생성되지 않습니다.



17

파이썬, 33 자

>>> import ctypes;ctypes.string_at(0)
Segmentation fault

출처 : http://bugs.python.org/issue1215#msg143236

파이썬, 60 자

>>> import sys;sys.setrecursionlimit(1<<30);f=lambda f:f(f);f(f)
Segmentation fault

출처 : http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup

이것은 내가 테스트하고있는 파이썬 버전입니다.

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin

일반적으로 파이썬 인터프리터는 충돌하기 어렵지만 위의 내용은 선택적인 모욕입니다.


16

넷째-3 자

0 @

( @페치입니다)


1
현대 시스템에서 작동하는 가장 짧은 것.
Demi

2
어느 것? Gforth는 "잘못된 메모리 주소"라고 말합니다
cat

15

C, 18

main(){raise(11);}

코드 목록에 #include <signal.h>를 추가해야합니까?
Florian Castellane

5
@FlorianCastellane : C90 이하에서는 가시적 선언없이 수행 된 모든 함수 호출에 대해 컴파일러에서 암시 적으로로 선언합니다 int func(). 즉 int, 지정되지 않은 매개 변수를 사용하여을 반환하는 함수 입니다. 이 경우 raiseint를 반환하고 int 인수를 사용하는 함수이므로 (컴파일러가 불평하더라도) 해결됩니다.
Hasturkun

14

펄 (<5.14), 9 자

/(?{??})/

5.14에서는 정규식 엔진이 재진입되어 이러한 방식으로 충돌 할 수 없었지만이 작업을 시도하면 5.12 이하 버전에서 segfault가 수행됩니다.


Perl 5.14 (Debian) 및 5.18 (Arch Linux)에서 이것을 재현 할 수 있습니다. sprunge.us/RKHT
nyuszika7h

Perl v5.20.2 (윈도우)로 재현
mehi

14

W32 .com 실행 파일-0 바이트

이것은 이상하게 보이지만 32 비트 Windows 시스템에서 빈 .com 파일을 만들고 실행하면 무언가에 따라 segfault 발생할 있습니다. DOS는 (메모리 관리가없고 8086 오류가 발생하는 의미있는 세그먼트가없는) 8086을 받아들이고 64 비트 Windows는 실행을 거부합니다 (.com 파일을 실행할 v86 모드가없는 x86-64).


13

brainfuck (2)

<.

예, 이것은 구현에 따라 다릅니다. SIGSEGV는 좋은 컴파일러의 결과 일 것입니다.


4
"좋은"컴파일러는 어떻게 작동합니까? 그것은 <효과가 없거나 감싸 야합니다.
nyuszika7 시간

12
경계 위반시 즉시 런타임 오류를 생성하는 것이 가장 좋습니다. 프로그래머가 가능한 빨리 버그를 찾아서 고칠 수 있기 때문입니다. 버그가있는 프로그램을 잠시 동안 실행시키고 충돌하기 전에 메모리를 손상시키는 것은 문제를 진단하기 어렵게 만듭니다. 제안한 바와 같이 충돌을 완전히 방지하는 것은 최악입니다. 프로그래머는 프로그램을 "작동"하고 표준 컴파일러와 인터프리터에서 충돌 할 때 공개적으로 수치를 당할 수 있습니다.
Daniel Cristofani

1
반대로, 런타임 전에 범위 위반을 포착하는 것은 일반적으로 가능하지 않으며, 가능한 경우에는 특히 유용하지 않습니다. 좀 더 설명적인 런타임 오류를 생성하는 것은 괜찮지 만 운영 체제가 segfault로 오류를 포착하는 것은 속도 비용이 없기 때문에 좋습니다. (확실하지 않은 경우 컴파일러 자체는 segfault가 아닙니다. 경계를 벗어난 메모리에 액세스하려고하면 segfault가 실행 파일을 생성합니다.)
Daniel Cristofani

4
이 동작을 생성하고이 챌린지가 게시되기 전에 만들어진 구현을 제공 할 수 있습니까? 그렇지 않은 경우이 답변은 유효하지 않습니다.
Mego

1
바운드 검사는 구현에 따라 다르므로 오류가 발생할 것이라고 확신합니다. SIGSEGV가 있습니까? 나는 그것을 의심한다. 배열 래핑에 의존하는 많은 프로그램이 있지만 왼쪽에 있습니다. 양쪽에 확장 가능한 스토리지를 사용하는 것이 다소 편리 할 수 ​​있습니다.
captncraig

12

하스켈, 31

foreign import ccall main::IO()

이것은 GHC로 컴파일되고 실행될 때 segfault를 생성합니다. 외부 기능 인터페이스가 Haskell 2010 표준에 있으므로 확장 플래그가 필요하지 않습니다.


10

C- 11 (19) 7 (15) 6 (14) 1 자, AT & T x86 어셈블러-8 (24) 자

C 버전은 다음과 같습니다

*(int*)0=0;

전체 프로그램 (ISO와 완전히 호환되지 않음, K & R C라고 가정하자)의 길이는 19 자입니다.

main(){*(int*)0=0;}

어셈블러 변형 :

orl $0,0

전체 프로그램의 길이는 24 자입니다 (실제로 어셈블러가 아니기 때문에 평가 용).

main(){asm("orl $0,0");}

편집 :

몇 가지 C 변형. 첫 번째는 전역 포인터 변수의 0 초기화를 사용합니다.

*p;main(){*p=0;}

두 번째는 무한 재귀를 사용합니다.

main(){main();}

마지막 변형은 가장 짧은 것 -7 (15) 자입니다.

편집 2 :

위의 6 (14) 자 중 하나보다 짧은 변형을 하나 더 발명했습니다. 리터럴 문자열이 읽기 전용 세그먼트에 있다고 가정합니다.

main(){*""=0;}

편집 3 :

그리고 마지막 시도-1 문자 길이 :

P

다음과 같이 컴파일하십시오.

cc -o segv -DP="main(){main();}" segv.c

3
C에서는 메인 이 아닙니다 . 단 5 명의 캐릭터
Arya

1
: 링커는 main이 기능인지 여부를 확인하지 않습니다. 로더에 전달하고 sigsegv를
Arya

1
@FUZxxl이 경우 main0으로 초기화 된 전역 int 변수이므로 0 바이트를 실행 한 결과입니다. x86에서는에 add %al,(%rax)저장된 주소에서 메모리에 도달하려고 시도하는 완벽하게 유효한 명령 과 같은 것 입니다 %rax. 좋은 주소를 가질 가능성은 최소입니다.
알렉산더 Bakulin

6
물론 마지막 항목을 모든 용도로 사용할 수 있으므로 올바른 컴파일러 인수를 제공하면됩니다. 코드 골프 대회의 자동 승자가되어야합니다. :-)
celtschk

5
일반적으로 사용할 언어 버전을 선택하는 것 이외의 컴파일러 플래그는 합계로 계산됩니다.
Jerry Jeremiah

9

dc-7 자

[dx0]dx

스택 오버플로를 일으킴


작품이지만 정교하게 할 수 있습니까? 왜 그런 식으로 행동합니까?
Stéphane Gourichon

2
[dx0]dx0스택에 저장 한 다음 d상단 스택 요소 를 복제 한 다음 x상단 스택 요소 ( dx0) 를 팝하여 실행합니다. 상단 스택 요소를 복제하고 실행하기 시작합니다 ... 0이 꼬리 호출을 방지하기 위해 거기에 있어야하므로 모두 쌓입니다.
벤 밀우드

8

펄, 10/12 자

약간 치트 한 해결책은 Joey Adams의 bash 트릭 에서 하나의 char를 면도하는 것 입니다 .

kill 11,$$

그러나 Perl에서 실제 segfault를 얻는 unpack p것은 확실한 해결책입니다.

unpack p,1x8

주소 0x31313131 (또는 64 비트 시스템의 경우 0x3131313131313131)은 우연히 유효한 주소 공간을 가리킬 수 있기 때문에 기술적으로 이것은 segfault를 보장 하지 않습니다 . 그러나 확률은 반대입니다. 또한 포인터가 64 비트보다 긴 플랫폼으로 perl을 이식하면 x8증가해야합니다.


1
이게 뭐야 1x8?
Hannes Karppila

@HannesKarppila 짧은 글쓰기 방법"11111111".
Ilmari Karonen

8

파이썬 33

import os
os.kill(os.getpid(),11)

파이썬에서 신호 11 (SIGSEGV) 보내기.


2
또한 33 문자 : from os import*kill(getpid(),11)
Timtech

8

OCaml, 13 바이트

Obj.magic 0 0

이 함수 Obj.magic는 두 가지 유형을 안전하지 않게 강제 하는 기능을 사용합니다 . 이 경우 0 (GC에서 사용하는 태그 비트로 인해 즉시 값 1로 저장 됨)을 함수 유형 (포인터로 저장 됨)으로 강제 변환합니다. 따라서 주소 1을 역 참조하려고 시도하며 물론 segfault입니다.


1
it coerces 0 (stored as the immediate value 1)-왜 0이 1로 저장됩니까?
Skyler

1
@Skyler는 편집 참조
데미

1
Obj.magic()0: 하나의 짧은 문자 :)
벤 밀우드

8

배쉬, 4 바이트

골프

. $0

스크립트를 재귀 적으로 포함하십시오.

설명

재귀 "소스"(.) 작업은 결국 스택 오버플로를 발생시키고 Bashlibsigsegv 와 통합되지 않으므로 SIGSEGV가 발생합니다.

여기에 설명 된대로 이는 버그가 아니라 예상되는 동작 입니다.

테스트

./bang 
Segmentation fault (core dumped)

온라인으로 사용해보십시오!


8

실제로 , 17 16 11 10 9 바이트

⌠[]+⌡9!*.

온라인으로 사용해보십시오!

위의 내용이 충돌하지 않으면 숫자를 늘려보십시오 (여러 숫자는 실제로 앞에 콜론으로 지정됨)

깊이 중첩 된 객체를 포함하는 파이썬의 버그를 악용하여 인터프리터를 충돌시킵니다. itertools.chain실제로는 +연산자 를 구현하는 데 사용됩니다 .


7

C #-62

System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);

편집 : 23

unsafe{int i=*(int*)0;}

이 기능이 작동하려면 / unsafe로 컴파일해야합니다. 어떤 이유로 나는 이해하지 못하고 *(int*)0=0NullReferenceException을 던지는 반면이 버전은 적절한 액세스 위반을 제공합니다.


int i=*(int*)0;반환 나를 위해 NullReferenceException이.
피터 올슨

*(int*)-1=0액세스 위반과 같은 부정적인 위치에 액세스하려고 할 수 있습니다 .
피터 올슨

특별한 예외는 clr이 그것을 감싸는 것입니다. os 자체는 실제로 이러한 모든 경우에 세그 결함을 제공합니다.
captncraig

*(int*)0=0예외가 발생하는 이유 는 최적화 때문일 수 있습니다. 특히, 검사 비용을 피하기 위해 null옵티마이 저는 널 검사를 제거 할 수 있지만 segfault가 발생하면이를 적절한 것으로 다시 던질 수 있습니다 NullReferenceException.
Konrad Borowski

7

PicoLisp-4 자

$ pil
: ('0)
Segmentation fault

이것은 의도 된 행동입니다. 그들의 웹 사이트에 설명 된대로 :

일부 프로그래밍 언어가 "Swiss Army Knife of Programming"이라고 주장하는 경우 PicoLisp는 "Scalpel of Programming"이라고 할 수 있습니다.


7

F90-39 바이트

real,pointer::p(:)=>null()
p(1)=0.
end

편집:

gfortran segv.f90 -o segv 

실행:

./segv 

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x7FF85FCAE777
#1  0x7FF85FCAED7E
#2  0x7FF85F906D3F
#3  0x40068F in MAIN__ at segv.f90:?
Erreur de segmentation (core dumped)

기재:

gfortran --version
GNU Fortran (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4

1
좋은 첫 번째 게시물.
Rɪᴋᴇʀ

6

C에서 19 자

main(a){*(&a-1)=1;}

메인 함수의 리턴 주소 값을 손상시켜의 리턴시 SIGSEGV를 얻습니다 main.


스택 프레임 레이아웃에 따라 다르므로 일부 아키텍처에서는 실패 할 수 있습니다.
Alexander Bakulin

6

J (6)

memf 1

memf사용 가능한 메모리를 의미 1하고 포인터로 해석됩니다.


5

사이 톤, 14

이것은 종종 디버깅 목적으로 유용합니다.

a=(<int*>0)[0]

5

유닉스 PDP-11 어셈블리, 18 바이트 바이너리, 7 바이트 소스

(이것은 저와의 테마가되고 있습니다. 아마도 여기서 아무도 모르는 유일한 언어이기 때문일 것입니다.)

inc(r0)

프로그램 시작시 r0의 초기 값 (simh 디버거에 따라 05162 임)으로 지정된 단일 바이트를 증가시킵니다.

0000000 000407 000002 000000 000000 000000 000000 000000 000000
0000020 005210 000000

그리고 항상 그렇듯이 끝에서 불필요한 바이트는 스트립으로 제거 할 수 있습니다.

소스를 더 짧게 만들려고 몇 번 시도했지만 항상 구문 오류 또는 SIGBUS가 발생했습니다.


5

Matlab-가능합니다!

질문 에 대한 으로, Amro는이 문제 를 생각해 냈습니다.

S = struct();
S = setfield(S, {}, 'g', {}, 0)

Matlab 버전을 알려주십시오-R2015B (및 2016B)도 오류가 발생합니다. setfield 사용 오류 (56 행) 최소한 하나의 색인이 필요합니다.
Florian Castellane

@FlorianCastellane 현재 모든 버전을 시험해볼 수는 없지만 최신 버전 인 2014b 및 가장 빠른 2012a 인 일부 버전에서는 segfault를 제공하는 것으로 확인되었습니다.
데니스 Jaheruddin

5

자바 스크립트 셸, 7 바이트

clear()

현재 스코프가 아니라 모든 것을 완전히 지 웁니다. 이로 인해 많은 붕크가 발생하여 JS가 폭발하고 segfaulting됩니다.


MDN (document.clear)에 따르면, 이것은 실제로 이전 버전의 Mozilla에서만 작동해야하며 경험조차도 실제로 무엇을해야합니까?
tomsmeding

@tomsmeding 이것은 window.clear, FF는 직접 공개하지 않습니다, 그것은 거미 원숭이 내장
Downgoat

5

Pyth, 3 자

j1Z

이것은 합법적으로 단서없다는 점을 제외 하고는이 답변을 어떻게 제시했는지 설명하는 부분 입니다. 누군가 나를 위해 이것을 설명 할 수 있다면, 나는 감사 할 것입니다.

여기는 온라인 통역사입니다.

설명

j베이스가 제곱보다 크거나 나올 때까지베이스를 제곱하고 재귀 적으로 호출합니다. 밑이 0 이므로 결코 발생하지 않습니다. 충분히 높은 재귀 제한으로 segfault를 얻습니다.

- 데니스 ♦


뭔가 알아 냈어! Pyth의 소스를 탐색에서, 나는이 코드는 않는 것으로 확인 j10있는 시도 변환 1기지로 0. 그 segfaults, 왜 모르겠어요 ...
NoOneIsHere 여기에

1
여기를 참조 하십시오 . j베이스가 제곱보다 크거나 나올 때까지베이스를 제곱하고 재귀 적으로 호출합니다. 밑이 0 이므로 결코 발생하지 않습니다. 충분히 높은 재귀 제한으로 segfault를 얻습니다.
Dennis

@Dennis IDEone
NoOneIsHere

@SeeRhino Pyth 인터프리터는 재귀 한계를 100,000으로 설정합니다. 적어도 TIO에서는 segfault에 충분합니다.
Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.