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

분할 오류 (SIGSEGV)를 발생시키는 가장 짧은 코드 작성 모든 프로그래밍 언어.

댓글

  • 와. 아마도 가장 짧은 성공적인 질문 일 것입니다.
  • @MatthewRoh 관심을 가지고 SEDE 쿼리를 만들었습니다. +10 이상의 몇 개가있는 것 같지만 이것은 +40 이상의 첫 번째

답변

C, 5 자

main; 

It “sa 변수 선언-int 유형이 암시됩니다 ( B 언어) 및 0가 기본값입니다. 실행시 숫자 실행을 시도하고 (숫자는 실행 가능하지 않음) SIGSEGV가 발생합니다. .

온라인으로 사용해보세요!

댓글

  • @Macmade : 사실은 0입니다. static 변수는 0로 시작하고 main;static, 함수 외부에서 선언했듯이. c-faq.com/decl/initval.html
  • 마지막으로이 제품을 가지고 놀았을 때 ‘ 세그 폴트의 다른 이유입니다. 우선 main을 호출하여 값이 아닌 main 위치로 이동합니다. 또 다른 것은 main가 int입니다. ‘ .bss에있는 s, 일반적으로 함수는 .text에 있으며, 커널이 elf 프로그램을로드 할 때

    이며 .bss에 대해 실행할 수 없으므로 main을 호출하여 실행 불가능한 페이지로 이동하고 이러한 페이지에서 무언가를 실행하면 보호 오류입니다.

  • 예, C의 segfault는 거의 기본값입니다. : P
  • main __attribute__((section(".text#")))=0xc3; FTFY (적어도 x86에서 충돌).
  • @jozxyqk 또는 더 짧게, const main=195;. 흥미로운 점은 ‘가 작동한다는 점입니다.이 코드 골프 도전의 목표는 코드가 작동하지 않고 segfault를 만드는 것이 었습니다.

답변

배쉬, 11            

kill -11 $$ 

설명

  • 11 자 신호 11입니다. 합법적 인 것 같습니다.
  • @ nyuszika7h 귀하의 댓글에 찬성 투표를하려고했지만 지금 당장 11 개의 찬성 투표가 있으므로 ‘ 그것만 남겨 두겠습니다. : P
  • @AlexL. 다른 사람들은 그것을 망쳐 놓은 것 같습니다 : (
  • @theonlygusti 예 … 그건 ‘ 너무 나쁩니다. 🙁 아, 그럼 이제 찬성 할 수 있어요 .
  • 최대 42 개 찬성, 손대지 않음!

답변

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

RET 

이 코드는 세그 폴트입니다.

댓글

  • MSDOS .com 파일로서 오류없이 실행되고 종료됩니다.
  • 내 요점 : “어셈블리”를 지정하는 것만으로는 ‘ 그것을 segfault로 만드십시오.
  • @JB : MS DOS에서 아니 프로그램은 세그멘테이션 오류를 발생하지 않습니다 . 그 ‘는 MS DOS가 메모리 보호가 존재하지 않는 리얼 모드에서 실행되기 때문입니다.
  • @celtschk IIRC NTVDM은 존재하지 않는 주소와 MS-DOS에 할당되지 않은 주소에서 방출됩니다.
  • @celtschk : mov bx, 1000h; shr ebx, 4; mov eax, [ebx]-> CPU 상승 기본 SEGV입니다 (AFAIK는 ‘ 아무도 처리 할 수 없습니다).

답변

Python 2, 13

exec"()"*7**6 

Windows에서 c00000fd (스택 오버플로) 오류 코드를보고합니다. 세분화 오류.

Alex A.와 Mego 덕분에 Mac 및 Linux 시스템에서도 세분화 오류가 발생하는 것으로 확인되었습니다. Python은 프로그램을 이식 할 때 사용하는 언어입니다.

댓글

  • Segmentation fault: 11 Mac
  • Segmentation fault (core dumped) Linux의 경우
  • 먼저 끊나요?
  • @MegaMan ? 아니요, 7 ** 6은 약 100K에 불과하므로 ‘인지 할 수있는 지연이 없습니다.
  • @MaxGasner 프로그래밍 언어를 다시 읽으십시오. 🙂

Answer

pdfTeX ( 51)

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

실제로는 버그 일 수 있지만 Knuth가 작성한 원래 TeX : pdftex filename.tex 대신 tex filename.tex로 코드를 컴파일하면 세그 폴트가 생성되지 않습니다.

답변

LOLCODE, 4 바이트

OBTW 

온라인으로 만 작동하지 않음 C 인터프리터에서.

댓글

  • LOL FANCY CODE M8 8/8 KTHXBYE

답변

Python, 33 자

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

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

Python, 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 버전입니다. n 테스트 대상 :

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

일반적으로 Python 인터프리터는 충돌하기 어렵지만 위는 선택적 악용입니다 …

답변

Forth-3 자

0 @ 

(@는 가져 오기입니다.)

댓글

  • 최신 시스템에서 작동하는 가장 짧은 댓글입니다.
  • 어느 쪽입니까? Gforth가 방금 ” 잘못된 메모리 주소 ”

답변

이라고 말합니다.

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

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

답변

C, 18

main(){raise(11);} 

댓글

  • 코드 목록에 #include < signal.h >를 추가해야합니까?
  • @FlorianCastellane : C90 이하에서는 보이는 선언없이 수행 된 모든 함수 호출에 대해 컴파일러가이를 암시 적으로 int func()로 선언합니다. 즉, 지정되지 않은 매개 변수를 사용하여 int를 반환하는 함수입니다. 이 경우 raise는 int를 반환하는 함수이며 int 인수를 취하므로 작동합니다 (컴파일러가 불평하더라도).
  • @Hasturkun main(){main();}

답변

Perl (< 5.14), 9 자

/(?{??})/ 

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

코멘트

  • Perl 5.14 (Debian) 및 5.18 (Arch Linux)에서 재현 할 수 있습니다. sprunge.us/RKHT
  • Perl v5.20.2 (windows)로 재현
  • /(?R)/ 이전 Perl 버전에 있습니까?

답변

brainfuck (2)

<. 

예, 구현에 따라 다릅니다. SIGSEGV는 좋은 컴파일러의 결과 일 가능성이 높습니다.

댓글

  • ” 좋은 “? <는 효과가 없거나 줄 바꿈하지 않아야합니다.
  • 경계 위반시 런타임 오류를 즉시 생성하는 것이 가장 좋습니다. 이는 프로그래머가 다음과 같이 버그를 찾아 수정할 수 있기 때문입니다. 가능한 한 빨리. 버그가있는 프로그램을 잠시 실행하고 충돌하기 전에 실수로 메모리를 손상 시키면 문제를 진단하기가 더 어려워집니다. 당신이 제안한 것처럼 충돌을 완전히 방지하는 것은 최악입니다. 프로그래머는 ” 작동 ” 프로그램을 얻은 다음 표준 컴파일러 및 인터프리터에서 충돌 할 때 공개적으로 수치를 당할 수 있습니다.
  • 반대로 런타임 전에 경계 위반을 포착하는 것은 일반적으로 불가능하며 가능한 경우 특히 유용하지 않습니다. 더 설명적인 런타임 오류를 생성하는 것은 괜찮지 만 운영 체제가 속도 비용이 전혀 들지 않기 때문에이를 segfault로 포착하는 것이 좋습니다. ‘ (‘ 명확하지 않은 경우, 컴파일러 자체는 ‘ segfault를 수행하지 않습니다. 한계를 벗어난 메모리에 액세스합니다.)
  • 이 문제가 게시되기 전에 생성 된이 동작을 생성하는 구현을 제공 할 수 있습니까? 그렇지 않은 경우이 답변은 유효하지 않습니다.
  • 경계 검사는 구현에 따라 다르므로 ‘ 오류가 발생할 수있는 항목이 있는지 확인합니다.그래도 SIGSEGV가 있습니까? 나는 그것을 의심한다. 그래도 왼쪽의 배열 배치에 의존하는 많은 프로그램이 있습니다. 양쪽에 확장 가능한 스토리지가 있으면 오히려 편리 할 수 있습니다.

답변

Haskell, 31

foreign import ccall main::IO() 

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

댓글

  • Awwww. import Foreign;main=peek nullPtr::IO Int를 게시하려고했지만 ‘ 40 개를 게시했습니다.

답변

배시, 4 바이트

골프 형

 . $0  

스크립트를 자체에 재귀 적으로 포함합니다.

설명 됨

재귀 적 ” 소스 ” (.) 작업으로 인해 결국 스택 오버플로가 발생하며 Bash libsigsegv 와 통합되지 않습니다. , 이로 인해 SIGSEGV가 발생합니다.

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

테스트

 ./bang Segmentation fault (core dumped)  

온라인으로 사용해보세요!

답변

Python 33

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

python으로 신호 11 (SIGSEGV)을 보냅니다.

댓글

  • 또한 33 자 : from os import*kill(getpid(),11)

답변

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

C 버전은 다음과 같습니다.

*(int*)0=0; 

전체 프로그램 (아주 ISO가 아닙니다. -준수, K & RC) 길이가 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 

댓글

  • C에서는 ‘ t main; 5 개 문자 만
  • : Linker는 ‘ main이 기능인지 여부를 확인하지 않습니다. 로더 및 반환 sigsegv
  • @FUZxxl이 경우 main는 0으로 초기화 된 전역 int 변수이므로 결과는 다음과 같습니다. 0 바이트 실행을 시도한 결과입니다. x86에서는 ‘ add %al,(%rax)와 같이 %rax. 좋은 주소를 가질 가능성은 최소화됩니다.
  • 물론 마지막 항목은 모든 것에 사용할 수 있으며 올바른 컴파일러 인수를 제공하기 만하면됩니다. 코드 골프 대회의 자동 승자가 될 것입니다. 🙂
  • 일반적으로 사용할 언어 버전을 선택하는 것 이외의 컴파일러 플래그는 합계에 포함됩니다.

Answer

Perl, 10/12 자

약간 속임수를 사용하는 방법은 Joey Adams “bash 트릭을 1 자씩 줄이는 것입니다. :

kill 11,$$ 

그러나 Perl에서 실제 segfault를 얻으려면 unpack p가 확실한 솔루션입니다. :

unpack p,1x8 

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

댓글

  • 1x8 것은 무엇입니까?
  • @HannesKarppila It ‘ "11111111".

답변

dc-7 자

[dx0]dx 

스택 오버플로 발생

댓글

  • 작품이지만 자세히 설명 할 수 있습니까? 왜 그런 식으로 작동합니까?
  • [dx0]는 스택에 dx0를 저장 한 다음 d는 최상위 스택 요소를 복제 한 다음 x는 최상위 스택 요소 (dx0)를 팝하고 실행합니다. 최상위 스택 요소를 복제하고 실행을 시작합니다 … 0가 꼬리 호출이되는 것을 방지하기 위해 거기에 있어야하므로 모두 빌드됩니다.

답변

PicoLisp-4 자

$ pil : ("0) Segmentation fault 

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

일부 프로그래밍 언어가 “프로그래밍의 스위스 군용 칼”이라고 주장하는 경우 PicoLisp는 “Scalpel of Programming “: 날카 롭고 정확하며 작고 가벼우면서도 경험이없는 사람에게는 위험합니다.

답변

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 

댓글

  • 좋은 첫 게시물입니다.

답변

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

⌠[]+⌡9!*. 

온라인으로 시도해보세요!

위의 방법이 충돌하지 않으면 숫자를 늘려보십시오 (여러 자리 숫자는 Actually에서 선행 콜론으로 지정됩니다. )

통역이 중단됨 r 깊이 중첩 된 itertools.chain 객체와 관련된 python의 버그 를 악용하여 실제로 + 연산자.

답변

OCaml, 13 바이트

Obj.magic 0 0 

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

코멘트

  • it coerces 0 (stored as the immediate value 1)-0이 1로 저장되는 이유는 무엇입니까?
  • @Skyler see edit
  • Obj.magic()0가 1 자 더 짧습니다. 🙂

답변

Pyth, 3 자

j1Z 

내가 합법적으로 단서 가 없다는 점을 제외하고는이 답변을 어떻게 생각해 냈는지 설명하는 부분입니다. 누군가 나를 대신해 설명해 주시면 감사하겠습니다.

여기 온라인 통역사가 있습니다.

설명

j 밑수를 제곱하고 밑 수가 적어도 숫자만큼 커질 때까지 자신을 재귀 적으로 호출합니다. 밑수는 0 이므로 재귀 한도가 충분히 높으면 segfault가 발생합니다.

Dennis ♦

댓글

  • 뭔가 알아 냈습니다! Pyth ‘의 소스를 탐색 한 결과이 코드가 1j를 수행한다는 것을 발견했습니다. / div> 및 01를 기본 0 시도 합니다.

. 왜 그 segfaults, 나는 아이디어 …

  • 여기 를 참조하세요. j는 밑을 제곱하고 밑이 최소한 숫자만큼 커질 때까지 자신을 재귀 적으로 호출합니다. 베이스가 0 이기 때문에 결코 일어나지 않습니다. 재귀 제한이 충분히 높으면 세그 폴트가 발생합니다.
  • @Dennis IDEone
  • @SeeRhino The Pyth 인터프리터 재귀 제한을 100,000으로 설정합니다. 적어도 TIO에서는 ‘ segfault에 충분합니다.
  • 답변

    C #-62

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

    C # / unsafe, 23 바이트

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

    이해할 수없는 이유로 *(int*)0=0는 NullReferenceException을 발생시키는 반면이 버전은 적절한 액세스 위반을 제공합니다.

    댓글

    • int i=*(int*)0;는 나를 위해 NullReferenceException을 반환합니다.
    • *(int*)-1=0와 같은 부정적인 위치에 액세스를 시도하고 액세스 위반이 발생할 수 있습니다.
    • 특정 예외는 clr 그것을 감싸고 중요하지 않습니다. OS 자체는 실제로 이러한 모든 경우에 세그 오류를 제공합니다.
    • *(int*)0=0에서 예외가 발생하는 이유는 최적화 때문일 수 있습니다. 특히 null 검사 비용을 피하기 위해 최적화 프로그램은 null 검사를 제거 할 수 있지만 segfault가 발생하면 적절한 NullReferenceException.

    답변

    C의 19 자

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

    주 함수의 반환 주소 값이 손상되어 main 반환시 SIGSEGV를받습니다.

    Comments

    • 스택 프레임 레이아웃에 따라 다르므로 일부 아키텍처에서는 실패 할 수 없습니다.
    • 단순히 main; 또는 main(){*""=0;}?
    • @Sapphire_Brick main;이 (가) 이미 다른 답변에 제공되었습니다.
    • @saeedn 그렇다면 왜 그것을 게시합니까? 이것은 ‘ 두 번째로 짧은 것도 아닙니다!
    • @Sapphire_Brick 제가 게시물을 올릴 때 main;은 ‘ 게시되지 않았고 ‘ 작동하는지 몰랐습니다. 나는 그것이 이미 주어졌고 내 대답을 바꿀 필요가 없다는 것을 지적했습니다. 또한 여기에있는 사람들은 ‘ 가장 짧은 글만 게시하는 것이 아니라 문제를 해결하는 다른 방법도 흥미 롭습니다.

    Answer

    Cython, 14

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

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

    답변

    J (6)

    memf 1 

    memf는 여유 메모리를 의미하고 1는 포인터로 해석됩니다.

    댓글

    • 0가 아닌 1입니까? J에서 널 포인터를 해제하는 것이 합법적입니까?

    Answer

    Matlab-가능합니다!

    질문 에 대한 답변에서 Amro는 다음과 같은 특이한 점을 생각해 냈습니다.

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

    댓글

    • Matlab 버전을 알려주세요. R2015B (및 2016B도)에서 오류가 발생합니다. setfield를 사용하는 동안 오류 (56 행) 하나 이상 색인이 필요합니다.
    • @FlorianCastellane 현재 모든 버전을 시도 할 수는 없지만 일부 버전에서 segfault를 제공하는 것으로 확인되었습니다. 최신 버전은 2014b이고 가장 초기 버전은 2012a입니다.

    답변

    C-14 자

    설명 :

    문제는 _start를 C 함수 인 것처럼 처리했다는 것입니다. 그리고 그것에서 돌아 오려고했습니다. 실제로, 이것은 함수가 아닙니다. 링커가 프로그램의 진입 점을 찾기 위해 사용하는 객체 파일의 심볼 일뿐입니다. 프로그램이 호출되면 직접 호출됩니다. 살펴보면 스택 맨 위에있는 값이 1이라는 것을 알 수 있는데, 이는 확실히 주소와 매우 유사합니다. 실제로 스택에있는 것은 프로그램의 argc 값입니다. 그 다음에는 종료 NULL 요소를 포함하는 argv 배열 요소와 envp 요소가 뒤 따릅니다. 그리고 그게 전부입니다. 스택에 반환 주소가 없습니다.

    댓글

    • I ‘ 추가 인수로 점수를 매겨 야합니다
    • 특수 플래그에 14 바이트를 추가해야합니다.
    • @ErikGolfer エ リ ッ ク ゴ ル フ ァ ー -nostartfiles는 실제로 13 바이트 길이입니다. 🙂
    • @CharlesPaulet 공간도 계산해야한다고 생각합니다.

    Answer

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

    (이것은 제가 아는 유일한 언어이기 때문일 수 있습니다. 다른 하나는 여기에 있습니다.)

    inc(r0) 

    현재 r0의 초기 값 [simh 디버거에 따라 05162가 됨]로 주소 지정되는 단일 바이트를 증가시킵니다. 프로그램 시작.

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

    언제나 그렇듯이 끝에있는 불필요한 바이트는 스트립으로 제거 할 수 있습니다.

    몇 가지를 만들었습니다. 소스를 더 짧게 만들려고 시도하지만 항상 ge 구문 오류 또는 SIGBUS 중 하나입니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다