Mã ngắn nhất làm tăng SIGSEGV


Câu trả lời:


113

C, 5 ký tự

main;

Đó là một khai báo biến - intloại được ngụ ý (tính năng được sao chép từ ngôn ngữ B) và 0là giá trị mặc định. Khi được thực thi, điều này cố gắng thực thi một số (số không thực thi được) và nguyên nhân SIGSEGV.

Hãy thử trực tuyến!


5
@MacADE: Thật ra là vậy 0. staticbiến bắt đầu như 0, và main;static, như tôi đã tuyên bố chức năng bên ngoài. c-faq.com/decl/initval.html
Konrad Borowski

16
lần trước tôi đã chơi với thứ này, tôi đã nhận ra rằng có một lý do khác nhau cho segfault. Trước hết, bằng cách gọi main, bạn nhảy đến vị trí của main, không phải giá trị, một thứ khác là mainint, nó nằm ở đó .bss, thường là các hàm được đặt trong .text, khi kernel tải chương trình elf, nó tạo ra một trang thực thi cho .textvà không -có thể thực hiện được .bss, vì vậy bằng cách gọi main, bạn chuyển đến một trang không thể thực thi và thực thi một cái gì đó trên một trang như vậy là một lỗi bảo vệ.
mniip

23
Đúng, segfaults trong C có khá nhiều mặc định: P
Paul Draper

1
main __attribute__((section(".text#")))=0xc3;FTFY (ít nhất là nó dường như quay trở lại mà không gặp sự cố trên x86 của tôi).
jozxyqk

2
@jozxyqk Hoặc ngắn hơn , const main=195;. Điều thú vị là nó hoạt động, mục tiêu của thử thách chơi gôn mã này là làm cho mã segfault, không hoạt động :).
Konrad Borowski

74

Bash, 11      

kill -11 $$

44
Tín hiệu 11 trong 11 ký tự. Có vẻ hợp pháp.
nyuszika7h

12
@ nyuszika7h Tôi sẽ nâng cao nhận xét của bạn, nhưng bạn có 11 upvote ngay bây giờ, vì vậy tôi sẽ để nó ở đó. : P
HyperNeutrino

3
@AlexL. những người khác dường như đã làm hỏng rằng :(
theonlygusti

2
@theonlygusti Vâng ... Điều đó thật tệ. :( Ồ tốt, sau đó tôi có thể nâng cấp nó ngay bây giờ.
HyperNeutrino

2
Lên đến 42 upvote, không có touchee!
seadoggie01

39

Hội (Linux, x86-64), 1 byte

RET

Mã này segfaults.


7
Là một tệp MSDOS .com, nó chạy và kết thúc mà không gặp lỗi.
JB

10
Quan điểm của tôi là: chỉ cần xác định lắp ráp trên mạng, không đủ để làm cho nó tách biệt.
JB

52
@JB: Trên MS DOS, sẽ không có chương trình nào tạo ra lỗi phân đoạn. Đó là bởi vì MS DOS chạy trong chế độ thực, nơi không có bảo vệ bộ nhớ.
celtschk

1
@celtschk IIRC NTVDM sẽ khai thác trên các địa chỉ không tồn tại và những địa chỉ không được phân bổ cho MS-DOS.
ζ--

2
@celtschk: Dù sao bạn cũng có thể segfault nó như vậy: Mov bx, 1000h; thu nhỏ, 4; Mov eax, [ebx] -> CPU tăng SEGV bên dưới (AFAIK không có ai để xử lý mặc dù).
Joshua

26

Con trăn 2, 13

exec'()'*7**6

Windows báo cáo mã lỗi của c00000fd (Stack Overflow) mà tôi cho rằng đó là một kiểu con của lỗi phân đoạn.

Nhờ Alex A. và Mego, nó được xác nhận là gây ra lỗi phân đoạn trên các hệ thống Mac và Linux. Python là ngôn ngữ được lựa chọn để phá vỡ chương trình của bạn.


7
Segmentation fault: 11trên Mac
Alex A.

7
Segmentation fault (core dumped)trên Linux
Mego

Cái này có treo lên trước không?
Mega Man

1
@MegaMan Như mất nhiều thời gian để hoàn thành? Không, 7 ** 6 chỉ khoảng 100K nên không có độ trễ có thể nhận thấy.
frageum

Tại sao điều này làm việc? Nó dường như không có trên Python 3.6.8 trên Mac OS.
Max Gasner

22

pdfTeX (51)

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

Đây thực sự có thể là một lỗi , nhưng nó không có trong TeX gốc, được viết bởi Knuth: biên dịch mã tex filename.texthay vì pdftex filename.texkhông tạo ra một segfault.



17

Con trăn, 33 ký tự

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

Nguồn: http://bugs.python.org/su1215#msg143236

Con trăn, 60 ký tự

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

Nguồn: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call Shikview=markup

Đây là phiên bản Python tôi đang thử nghiệm trên:

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

Nói chung, trình thông dịch Python khó gặp sự cố, nhưng ở trên là lạm dụng có chọn lọc ...


16

Forth - 3 ký tự

0 @

( @là một tìm nạp)


1
Ngắn nhất cho đến nay sẽ làm việc trên các hệ thống hiện đại.
Demi

2
Forth nào? Gforth chỉ nói "Địa chỉ bộ nhớ không hợp lệ"
cat

15

C, 18

main(){raise(11);}

bạn có cần thêm #include <signal.h> trong danh sách mã không?
Florian Castellane

5
@FlorianCastellane: trong C90 trở xuống, đối với bất kỳ lệnh gọi hàm nào được thực hiện mà không có khai báo rõ ràng, trình biên dịch sẽ khai báo nó là int func(). tức là một hàm trả về int, lấy tham số không xác định. Trong trường hợp raisenày là một hàm trả về int, lấy một đối số int, vì vậy điều này sẽ hoạt động (ngay cả khi trình biên dịch phàn nàn).
Hasturkun

14

Perl (<5.14), 9 ký tự

/(?{??})/

Trong 5.14, công cụ regex đã được thực hiện lại để nó không thể bị hỏng theo cách này, nhưng 5.12 và trước đó sẽ phân tách nếu bạn thử cách này.


Tôi có thể sao chép này trên Perl 5.14 (Debian) và 5.18 (Arch Linux). sprunge.us/RKHT
nyuszika7h

Được sao chép với Perl v5.20.2 (windows)
mehi 11/03/2016

14

W32 .com thực thi - 0 byte

Điều này có vẻ kỳ lạ, nhưng trên các hệ thống Windows 32 bit, việc tạo và thực thi một tệp .com trống có thể gây ra một segfault, tùy thuộc vào ... một cái gì đó. DOS chỉ chấp nhận nó (8086 không có quản lý bộ nhớ, không có lỗi phân đoạn có ý nghĩa) và Windows 64 bit từ chối chạy nó (x86-64 không có chế độ v86 để chạy tệp .com).


13

cân não (2)

<.

Vâng, điều này phụ thuộc vào việc thực hiện. SIGSEGV là kết quả có khả năng từ một trình biên dịch tốt.


4
Làm thế nào là một trình biên dịch segfaults trên "tốt" đó? Điều đó <hoặc không có tác dụng hoặc bao quanh.
nyuszika7h

12
Ngay lập tức tạo ra lỗi thời gian chạy khi vi phạm giới hạn là tốt nhất vì nó cho phép lập trình viên tìm và sửa lỗi nhanh nhất có thể. Để chương trình lỗi chạy một lúc và bộ nhớ bị hỏng một cách ngớ ngẩn trước khi gặp sự cố chỉ làm cho vấn đề khó chẩn đoán hơn. Ngăn chặn sự cố hoàn toàn, như bạn đề xuất, là tồi tệ nhất; lập trình viên có thể khiến chương trình "hoạt động" và sau đó bị bẽ mặt công khai khi nó gặp sự cố trên trình biên dịch và trình thông dịch chuẩn.
Daniel Cristofani

1
Ngược lại, việc bắt các vi phạm giới hạn trước khi chạy là không thể nói chung, cũng không đặc biệt hữu ích trong các trường hợp có thể. Tạo ra một lỗi thời gian chạy mô tả nhiều hơn sẽ ổn, nhưng việc hệ điều hành bắt nó như một segfault là điều tuyệt vời bởi vì nó không có bất kỳ chi phí tốc độ nào. (Trong trường hợp nó không rõ ràng, trình biên dịch tự nó không segfault - nó tạo ra file thực thi mà segfault ngay sau khi họ cố gắng truy cập vào bộ nhớ ngoài giới hạn.)
Daniel Cristofani

4
Bạn có thể cung cấp một triển khai tạo ra hành vi này và đã được tạo trước khi thử thách này được đăng không? Nếu không, câu trả lời này không hợp lệ.
Mego

1
Kiểm tra giới hạn là triển khai cụ thể, vì vậy tôi chắc chắn có một số lỗi sẽ xảy ra trên đó. Bất kỳ SIGSEGV mặc dù? Tôi nghi ngờ điều đó. Có một số lượng lớn các chương trình phụ thuộc vào gói bên trái. Nó có thể khá thuận tiện khi có lưu trữ có thể phát triển ở cả hai bên.
captncraig

12

Haskell, 31

foreign import ccall main::IO()

Điều này tạo ra một segfault khi được biên dịch với GHC và chạy. Không cần cờ mở rộng, vì Giao diện chức năng nước ngoài nằm trong tiêu chuẩn Haskell 2010.


10

C - 11 (19) 7 (15) 6 (14) 1 ký tự, trình biên dịch AT & T x86 - 8 (24) ký tự

Phiên bản C là:

*(int*)0=0;

Toàn bộ chương trình (không hoàn toàn tuân thủ ISO, giả sử đó là K & R C) dài 19 ký tự:

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

Biến thể lắp ráp:

orl $0,0

Toàn bộ chương trình dài 24 ký tự (chỉ để đánh giá, vì nó không thực sự là trình biên dịch):

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

CHỈNH SỬA :

Một vài biến thể C. Cái đầu tiên sử dụng khởi tạo không của biến con trỏ toàn cục:

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

Cái thứ hai sử dụng đệ quy vô hạn:

main(){main();}

Biến thể cuối cùng là một ký tự ngắn nhất - 7 (15).

EDIT 2 :

Phát minh thêm một biến thể ngắn hơn bất kỳ ký tự nào ở trên - 6 (14) ký tự. Nó giả định rằng các chuỗi chữ được đưa vào một phân đoạn chỉ đọc.

main(){*""=0;}

EDIT 3 :

Và lần thử cuối cùng của tôi - dài 1 ký tự:

P

Chỉ cần biên dịch nó như thế:

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

3
trong C không phải là chính; chỉ có 5 nhà từ thiện
Arya

1
: Trình liên kết không kiểm tra xem main có hoạt động hay không. Nó chỉ truyền nó cho trình tải và trả về sigsegv
Arya

1
@FUZxxl Trong trường hợp mainnày là biến int toàn cục được khởi tạo bằng 0, vì vậy những gì chúng ta nhận được là kết quả của việc cố gắng thực thi một số byte bằng không. Trong x86 add %al,(%rax), đó là một hướng dẫn hoàn toàn hợp lệ, cố gắng tiếp cận bộ nhớ tại địa chỉ được lưu trữ %rax. Cơ hội có một địa chỉ tốt là tối thiểu.
Alexander Bakulin

6
Tất nhiên mục cuối cùng có thể được sử dụng cho tất cả mọi thứ, bạn chỉ cần cung cấp đúng đối số trình biên dịch. Mà nên làm cho nó chiến thắng tự động của bất kỳ cuộc thi golf mã. :-)
celtschk

5
Thông thường các cờ biên dịch khác với các cờ chọn phiên bản ngôn ngữ sẽ sử dụng được tính vào tổng số.
Jerry Jeremiah

9

dc - 7 ký tự

[dx0]dx

gây ra tràn ngăn xếp


Là công trình, nhưng bạn có thể xây dựng? Tại sao nó hành xử theo cách đó?
Stéphane Gourichon

2
[dx0]lưu trữ dx0trên ngăn xếp, sau đó dsao chép phần tử ngăn xếp trên cùng, sau đó xbật phần tử ngăn xếp trên cùng ( dx0) và thực thi nó. Sao chép phần tử ngăn xếp trên cùng và bắt đầu thực thi nó ... 0cần phải ở đó để ngăn chặn đây là một cuộc gọi đuôi, vì vậy tất cả chúng đều được xây dựng.
Ben Millwood

8

Perl, 10/12 ký tự

Một giải pháp hơi gian lận là loại bỏ một trò lừa bịp của Joey Adams :

kill 11,$$

Tuy nhiên, để có được một segfault thực sự trong Perl, unpack plà giải pháp rõ ràng:

unpack p,1x8

Về mặt kỹ thuật, điều này không được đảm bảo cho segfault, vì địa chỉ 0x31313131 (hoặc 0x313131313131313131 trên các hệ thống 64 bit) chỉ có thể chỉ đến không gian địa chỉ hợp lệ. Nhưng tỷ lệ cược chống lại nó. Ngoài ra, nếu perl được chuyển đến các nền tảng nơi con trỏ dài hơn 64 bit, thì x8sẽ cần phải tăng lên.


1
Cái này là 1x8cái gì
Hannes Karppila

@HannesKarppila Đó là một cách viết ngắn"11111111".
Ilmari Karonen

8

Con trăn 33

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

Gửi tín hiệu 11 (SIGSEGV) trong python.


2
Ngoài ra 33 ký tự: from os import*kill(getpid(),11)
Timtech

8

OCaml, 13 byte

Obj.magic 0 0

Điều này sử dụng chức năng Obj.magic, mà không ép buộc bất kỳ hai loại. Trong trường hợp này, nó ép buộc 0 (được lưu dưới dạng giá trị ngay lập tức 1, do bit thẻ được sử dụng bởi GC) thành một loại hàm (được lưu dưới dạng con trỏ). Vì vậy, nó cố gắng hủy đăng ký địa chỉ 1, và điều đó tất nhiên sẽ segfault.


1
it coerces 0 (stored as the immediate value 1)- tại sao 0 được lưu dưới dạng 1?
Skyler

1
@Skyler xem chỉnh sửa
Demi

1
Obj.magic()0là một char ngắn hơn :)
Ben Millwood

8

Bash, 4 byte

Chơi gôn

. $0

Đệ quy bao gồm các kịch bản vào chính nó.

Giải thích

Hoạt động "nguồn" đệ quy (.) Cuối cùng gây ra tràn ngăn xếp và vì Bash không tích hợp với libsigsegv , điều này dẫn đến SIGSEGV.

Lưu ý rằng đây không phải là một lỗi, mà là một hành vi dự kiến, như được thảo luận ở đây .

Kiểm tra

./bang 
Segmentation fault (core dumped)

Dùng thử trực tuyến!


8

Trên thực tế , 17 16 11 10 9 byte

⌠[]+⌡9!*.

Hãy thử trực tuyến!

Nếu ở trên không gặp sự cố, hãy thử tăng số (số có nhiều chữ số được chỉ định trong Thực tế với dấu hai chấm đầu)

Làm hỏng trình thông dịch bằng cách khai thác một lỗi trong python liên quan đến các itertools.chainđối tượng lồng nhau sâu , mà thực sự sử dụng để thực hiện +toán tử.


7

C # - 62

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

Chỉnh sửa: 23

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

Phải biên dịch với / không an toàn để cái này hoạt động. Vì một số lý do tôi không hiểu, *(int*)0=0chỉ cần ném NullReferenceException, trong khi phiên bản này cung cấp vi phạm quyền truy cập phù hợp.


Trả int i=*(int*)0;về một NullReferenceException cho tôi.
Peter Olson

Bạn có thể thử truy cập một vị trí tiêu cực, thích *(int*)-1=0và vi phạm quyền truy cập.
Peter Olson

Ngoại lệ cụ thể chỉ là những gì clr kết thúc nó và không đáng kể. Bản thân os thực sự đưa ra lỗi seg trong tất cả các trường hợp này.
captncraig

Lý do tại sao *(int*)0=0ném một ngoại lệ có thể là do tối ưu hóa. Cụ thể, để tránh chi phí kiểm tra null, trình tối ưu hóa có thể loại bỏ kiểm tra null, nhưng khi xảy ra lỗi segfault, nó có thể điều chỉnh lại nó như một cách thích hợp NullReferenceException.
Konrad Borowski

7

PicoLisp - 4 ký tự

$ pil
: ('0)
Segmentation fault

Đây là hành vi dự định. Theo mô tả trên trang web của họ:

Nếu một số ngôn ngữ lập trình tự xưng là "Con dao lập trình của quân đội Thụy Sĩ", thì PicoLisp có thể được gọi là "Con dao lập trình": Sắc bén, chính xác, nhỏ và nhẹ, nhưng cũng nguy hiểm trong tay người thiếu kinh nghiệm.


7

F90 - 39 byte

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

Tổng hợp:

gfortran segv.f90 -o segv 

Chấp hành:

./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)

Nguyên vật liệu:

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

1
Đẹp bài đầu tiên.
R

6

19 ký tự trong C

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

Nó làm hỏng giá trị địa chỉ trả về của hàm chính, do đó, nó nhận được SIGSEGV khi trả về main.


Nó phụ thuộc vào bố cục khung ngăn xếp, vì vậy trong một số kiến ​​trúc, nó có thể không thể thất bại.
Alexander Bakulin

6

J (6)

memf 1

memfcó nghĩa là bộ nhớ trống, 1được hiểu là một con trỏ.


5

Con trăn, 14 tuổi

Điều này thường có ích cho mục đích gỡ lỗi.

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

5

Lắp ráp Unix PDP-11, nhị phân 18 byte, nguồn 7 byte

(điều này đang trở thành một chủ đề với tôi, có lẽ bởi vì đó là ngôn ngữ duy nhất tôi biết mà không ai khác ở đây làm.)

inc(r0)

Tăng các byte đơn được đánh địa chỉ theo giá trị ban đầu của r0 [xảy ra là 05162 theo trình gỡ lỗi simh] khi bắt đầu chương trình.

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

Và, như mọi khi, các byte ngoại lai ở cuối có thể được loại bỏ bằng dải.

Tôi đã thực hiện một vài nỗ lực để rút ngắn nguồn, nhưng cuối cùng luôn bị lỗi cú pháp hoặc SIGBUS.


5

Matlab - Vâng, điều đó là có thể!

Trả lời câu hỏi của tôi, Amro đã đưa ra cách giải quyết này:

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

Vui lòng cung cấp phiên bản Matlab - R2015B (và cả 2016B) chỉ gây ra lỗi: Lỗi khi sử dụng setfield (dòng 56) Ít nhất một chỉ số được yêu cầu.
Florian Castellane

@FlorianCastellane Hiện tại không thể thử tất cả các phiên bản, nhưng nó đã được xác nhận sẽ cung cấp một segfault trong một số phiên bản, phiên bản mới nhất là 2014b và sớm nhất là 2012a.
Dennis Jaheruddin

5

JavaScript Shell, 7 byte

clear()

Xóa tất cả mọi thứ, không chỉ phạm vi hiện tại mà rõ ràng gây ra rất nhiều nút, điều này dẫn đến việc JS nổ tung và phân tách


Theo MDN (document.clear), điều này chỉ nên làm một cái gì đó trong các phiên bản thực sự cũ của Mozilla, và thậm chí sau đó, điều gì thực sự khác biệt trong trải nghiệm của bạn?
tomsmeding

@tomsmeding đây là window.clear, FF trực tiếp không tiết lộ nó, đó là một SpiderMonkey built-in
Downgoat

5

Pyth, 3 ký tự

j1Z

Đây sẽ là phần mà tôi giải thích làm thế nào tôi đưa ra câu trả lời này, ngoại trừ tôi hợp pháp không có manh mối . Nếu bất cứ ai có thể giải thích điều này cho tôi, tôi sẽ biết ơn.

Đây là một thông dịch viên trực tuyến.

Giải trình

jbình phương cơ sở và gọi chính nó đệ quy cho đến khi cơ sở ít nhất bằng số lượng. Vì cơ sở là 0 , điều đó không bao giờ xảy ra. Với giới hạn đệ quy cao, bạn sẽ có được một segfault.

- Dennis ♦


Tìm ra một cái gì đó! Duyệt web nguồn Pyth, tôi phát hiện ra rằng đoạn mã này làm jtrên 10, mà cố gắng để chuyển đổi 1thành cơ sở 0. Tại sao lại có sự phân biệt đó, tôi không biết ...
NoOneIsHere

1
Xem tại đây . jbình phương cơ sở và gọi chính nó đệ quy cho đến khi cơ sở ít nhất bằng số lượng. Vì cơ sở là 0 , điều đó không bao giờ xảy ra. Với giới hạn đệ quy cao, bạn sẽ có được một segfault.
Dennis

@Dennis IDEone
NoOneIsHere

@SeeRhino Trình thông dịch Pyth đặt giới hạn đệ quy thành 100.000. Ít nhất là trên TIO, thế là đủ cho một segfault.
Dennis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.