모든 프로그래밍 언어에서 세그먼트 오류 (SIGSEGV) 를 발생 시키는 가장 짧은 코드를 작성하십시오 .
모든 프로그래밍 언어에서 세그먼트 오류 (SIGSEGV) 를 발생 시키는 가장 짧은 코드를 작성하십시오 .
답변:
main;
변수 선언입니다. int
유형이 암시되고 (B 언어에서 복사 된 기능) 0
기본값입니다. 실행될 때 숫자를 실행하려고 시도하고 (숫자는 실행 불가능합니다) SIGSEGV
.
0
입니다. static
변수는 다음과 같이 시작 0
하고 main;
있다 static
내가 외부 함수를 선언. c-faq.com/decl/initval.html
main
있는 int, 그것은에 위치하고 있습니다 .bss
일반적으로 기능의 위치, .text
커널이가 실행 페이지를 생성하는 ELF 프로그램을로드 할 때, .text
비를 대한 -executable .bss
주요 호출하여, 그래서 당신은 비 실행 페이지로 이동하고, 같은 페이지에 실행 뭔가가 보호 오류입니다.
main __attribute__((section(".text#")))=0xc3;
FTFY (적어도 x86에서 충돌하지 않고 돌아 오는 것처럼 보입니다).
const main=195;
. 흥미로운 것은 그것이 작동한다는 것입니다.이 코드 골프 도전의 목표는 작동하지 않는 코드를 segfault로 만드는 것입니다. :).
kill -11 $$
RET
이 코드는 segfault입니다.
exec'()'*7**6
Windows는 c00000fd (스택 오버플로) 오류 코드를보고합니다.이 오류는 세그먼테이션 오류의 하위 유형이라고 가정합니다.
Alex A.와 Mego 덕분에 Mac 및 Linux 시스템에서도 세그먼테이션 오류가 발생하는 것으로 확인되었습니다. Python은 프로그램을 이식 가능하게 충돌시키는 데 사용되는 언어입니다.
Segmentation fault: 11
Mac에서
Segmentation fault (core dumped)
Linux에서
\def~#1{\meaning}\write0{\expandafter~\string}\bye
이것은 실제로 버그 일지 모르지만 Knuth가 작성한 원래 TeX에는 존재 하지 않습니다. tex filename.tex
대신 코드를 컴파일 pdftex filename.tex
해도 segfault가 생성되지 않습니다.
>>> import ctypes;ctypes.string_at(0)
Segmentation fault
출처 : http://bugs.python.org/issue1215#msg143236
>>> 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
일반적으로 파이썬 인터프리터는 충돌하기 어렵지만 위의 내용은 선택적인 모욕입니다.
main(){raise(11);}
int func()
. 즉 int
, 지정되지 않은 매개 변수를 사용하여을 반환하는 함수 입니다. 이 경우 raise
int를 반환하고 int 인수를 사용하는 함수이므로 (컴파일러가 불평하더라도) 해결됩니다.
/(?{??})/
5.14에서는 정규식 엔진이 재진입되어 이러한 방식으로 충돌 할 수 없었지만이 작업을 시도하면 5.12 이하 버전에서 segfault가 수행됩니다.
<.
예, 이것은 구현에 따라 다릅니다. SIGSEGV는 좋은 컴파일러의 결과 일 것입니다.
<
효과가 없거나 감싸 야합니다.
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
main
0으로 초기화 된 전역 int 변수이므로 0 바이트를 실행 한 결과입니다. x86에서는에 add %al,(%rax)
저장된 주소에서 메모리에 도달하려고 시도하는 완벽하게 유효한 명령 과 같은 것 입니다 %rax
. 좋은 주소를 가질 가능성은 최소입니다.
[dx0]dx
스택 오버플로를 일으킴
[dx0]
dx0
스택에 저장 한 다음 d
상단 스택 요소 를 복제 한 다음 x
상단 스택 요소 ( dx0
) 를 팝하여 실행합니다. 상단 스택 요소를 복제하고 실행하기 시작합니다 ... 0
이 꼬리 호출을 방지하기 위해 거기에 있어야하므로 모두 쌓입니다.
약간 치트 한 해결책은 Joey Adams의 bash 트릭 에서 하나의 char를 면도하는 것 입니다 .
kill 11,$$
그러나 Perl에서 실제 segfault를 얻는 unpack p
것은 확실한 해결책입니다.
unpack p,1x8
주소 0x31313131 (또는 64 비트 시스템의 경우 0x3131313131313131)은 우연히 유효한 주소 공간을 가리킬 수 있기 때문에 기술적으로 이것은 segfault를 보장 하지 않습니다 . 그러나 확률은 반대입니다. 또한 포인터가 64 비트보다 긴 플랫폼으로 perl을 이식하면 x8
증가해야합니다.
1x8
?
"11111111".
Obj.magic 0 0
이 함수 Obj.magic
는 두 가지 유형을 안전하지 않게 강제 하는 기능을 사용합니다 . 이 경우 0 (GC에서 사용하는 태그 비트로 인해 즉시 값 1로 저장 됨)을 함수 유형 (포인터로 저장 됨)으로 강제 변환합니다. 따라서 주소 1을 역 참조하려고 시도하며 물론 segfault입니다.
it coerces 0 (stored as the immediate value 1)
-왜 0이 1로 저장됩니까?
Obj.magic()0
: 하나의 짧은 문자 :)
골프
. $0
스크립트를 재귀 적으로 포함하십시오.
설명
재귀 "소스"(.) 작업은 결국 스택 오버플로를 발생시키고 Bash 가 libsigsegv 와 통합되지 않으므로 SIGSEGV가 발생합니다.
여기에 설명 된대로 이는 버그가 아니라 예상되는 동작 입니다.
테스트
./bang
Segmentation fault (core dumped)
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
unsafe{int i=*(int*)0;}
이 기능이 작동하려면 / unsafe로 컴파일해야합니다. 어떤 이유로 나는 이해하지 못하고 *(int*)0=0
NullReferenceException을 던지는 반면이 버전은 적절한 액세스 위반을 제공합니다.
int i=*(int*)0;
반환 나를 위해 NullReferenceException이.
*(int*)-1=0
액세스 위반과 같은 부정적인 위치에 액세스하려고 할 수 있습니다 .
*(int*)0=0
예외가 발생하는 이유 는 최적화 때문일 수 있습니다. 특히, 검사 비용을 피하기 위해 null
옵티마이 저는 널 검사를 제거 할 수 있지만 segfault가 발생하면이를 적절한 것으로 다시 던질 수 있습니다 NullReferenceException
.
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
main(a){*(&a-1)=1;}
메인 함수의 리턴 주소 값을 손상시켜의 리턴시 SIGSEGV를 얻습니다 main
.
(이것은 저와의 테마가되고 있습니다. 아마도 여기서 아무도 모르는 유일한 언어이기 때문일 것입니다.)
inc(r0)
프로그램 시작시 r0의 초기 값 (simh 디버거에 따라 05162 임)으로 지정된 단일 바이트를 증가시킵니다.
0000000 000407 000002 000000 000000 000000 000000 000000 000000
0000020 005210 000000
그리고 항상 그렇듯이 끝에서 불필요한 바이트는 스트립으로 제거 할 수 있습니다.
소스를 더 짧게 만들려고 몇 번 시도했지만 항상 구문 오류 또는 SIGBUS가 발생했습니다.
clear()
현재 스코프가 아니라 모든 것을 완전히 지 웁니다. 이로 인해 많은 붕크가 발생하여 JS가 폭발하고 segfaulting됩니다.
j1Z
이것은 합법적으로 단서 가 없다는 점을 제외 하고는이 답변을 어떻게 제시했는지 설명하는 부분 입니다. 누군가 나를 위해 이것을 설명 할 수 있다면, 나는 감사 할 것입니다.
설명
j
베이스가 제곱보다 크거나 나올 때까지베이스를 제곱하고 재귀 적으로 호출합니다. 밑이 0 이므로 결코 발생하지 않습니다. 충분히 높은 재귀 제한으로 segfault를 얻습니다.
j
에 1
와 0
있는 시도 변환 1
기지로 0
. 그 segfaults, 왜 모르겠어요 ...