SIGSEGV'ı yükselten en kısa kod


Yanıtlar:


113

C, 5 karakter

main;

Değişken bir bildirimdir - inttür ima edilir (B diline kopyalanan özellik) ve 0varsayılan değerdir. Bu yapıldığında bir sayı çalıştırılmaya çalışılır (sayılar çalıştırılamaz) ve sebep olur SIGSEGV.

Çevrimiçi deneyin!


5
@ Macmade: Aslında öyle 0. staticdeğişkenler olarak başlar 0ve main;bir staticben dışarıda fonksiyonu bunu deklare olarak. c-faq.com/decl/initval.html
Konrad Borowski

16
Bu şey ile son oynadığımda, segfault için farklı bir neden olduğunu anladım. Her şeyden önce ana arayarak ana değil değer olduğu bölüme, başka bir şey olduğunu mainbir int, bu yer alır olduğunu .bssgenellikle fonksiyonları bulunmaktadır, .textçekirdek bunun için yürütülebilir bir sayfası oluşturur elf programı yüklediğinde, .textsigara -örneklenebilir .bss, bu nedenle ana çağrı yaparak, çalıştırılamaz bir sayfaya atlarsınız ve böyle bir sayfada bir şey yürütmek bir koruma hatasıdır.
mniip

23
Evet, C'deki segfaultslar hemen hemen varsayılandır: P
Paul Draper

1
main __attribute__((section(".text#")))=0xc3;FTFY (en azından x86'ma çarpmadan dönüyor gibi görünüyor).
jozxyqk

2
@jozxyqk Veya daha kısa const main=195;. İşin ilginç olması, bu kod golfünün zorluğunun amacı kodun çalışmamasını sağlamak :)
Konrad Borowski

74

Bash, 11      

kill -11 $$

44
11 karakterde 11 sinyal. Mantıklı gibi.
nyuszika7h

12
@ nyuszika7h Ben senin yorumunu oylayacaktım, ama şu anda 11 oy hakkın var, o yüzden onu bırakacağım. : P
HyperNeutrino 25:16

3
@AlexL. diğer insanlar şımarık görünüyor :(
theonlygusti

2
@ theonlygusti Evet ... Bu çok kötü. :( Ah, o zaman şimdi
oylayabilirim

2
42'ye kadar yükseltme, touchee yok!
seadoggie01

39

Derleme (Linux, x86-64), 1 bayt

RET

Bu kod segfaults.


7
Bir MSDOS .com dosyası olarak, hatasız çalışır ve sonlandırılır.
JB

10
Demek istediğim şu ki: sadece “derleme” yi belirtmek onu farklılaştırmak için yeterli değil.
JB

52
@JB: MS DOS üzerinde hiçbir programı olacak hiç bir segment hataya üretirler. Bunun nedeni, MS DOS'un bellek korumasının olmadığı gerçek modda çalışmasıdır.
celtschk

1
@celtschk IIRC NTVDM, varolmayan adreslere ve MS-DOS'a tahsis edilmemiş adreslere eklenir.
ζ--

2
@celtschk: Yine de şöyle bölüştürebilirsiniz: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] -> CPU, temel SEGV'yi yükseltir (AFAIK, bununla başa çıkabilecek kimse yoktur).
Joshua

26

Python 2, 13

exec'()'*7**6

Windows, c00000fd (Yığın Taşması) hata kodunu bildiriyor, ki bu bir segmentasyon hatasının alt tipi olduğunu varsayıyor.

Alex A. ve Mego sayesinde, Mac ve Linux sistemlerinde de segmentasyon hatalarına neden olduğu doğrulandı. Python, programlarınızı taşınabilir bir şekilde çökertmek için tercih edilen dildir.


7
Segmentation fault: 11Mac
Alex A.

7
Segmentation fault (core dumped)Linux'ta
Mego

Bu önce kapanıyor mu?
Mega Man,

1
@MegaMan Bitmesi uzun zaman alıyor mu? Hayır, 7 ** 6 sadece 100K'dır, yani algılanabilir bir gecikme olmaz.
feersum

Bu neden işe yarıyor? Mac OS'de Python 3.6.8'de görünmüyor.
Max Gasner

22

pdfTeX (51)

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

Bu aslında bir hatadır , ancak Knuth tarafından yazılan orijinal TeX'te mevcut değil: kodu tex filename.texyerine derlemek pdftex filename.texbir segfault üretmez.



17

Python, 33 karakter

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

Kaynak: http://bugs.python.org/issue1215#msg143236

Python, 60 karakter

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

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

Bu, üzerinde test ettiğim Python sürümüdür:

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

Genel olarak Python tercümanını çökertmek zor, ama yukarıdaki seçici küfürlülük ...


16

İleri - 3 karakter

0 @

( @bir getirmedir)


1
Şimdiye kadar en kısa olanı modern sistemler üzerinde çalışacak.
Demi

2
Hangisi? Gforth sadece "Geçersiz hafıza adresi" diyor
kedi

15

C, 18

main(){raise(11);}

Kod listesine #include <signal.h> eklemeniz gerekiyor mu?
Florian Castellane

5
@ FlorianCastellane: C90 ve daha düşük sürümlerde, görünür bir bildirim olmadan yapılan herhangi bir işlev çağrısı için derleyici dolaylı olarak bildirir int func(). yani intbelirtilmemiş parametreler alarak bir fonksiyon döndürme . Bu durumda raiseint döndüren, int argümanını alan bir işlevdir, bu nedenle bu derlenir (derleyici şikayet ederse).
Hasturkun

14

Perl (<5.14), 9 karakter

/(?{??})/

5.14'te, regex motoru, bu şekilde kilitlenememesi için canlandırıcı hale getirildi, ancak bunu denerseniz 5.12 ve önceki sürümler farklılaşacak.


Bunu Perl 5.14 (Debian) ve 5.18 (Arch Linux) ile yeniden üretebilirim. sprunge.us/RKHT
nyuszika7h

Perl v5.20.2 (pencereler) ile üretilmiştir
mehi

14

W32 .com çalıştırılabilir - 0 bayt

Bu garip görünecek, ancak 32 bit Windows sistemlerinde, boş bir .com dosyası oluşturmak ve yürütmek, bir şeye bağlı olarak ... bir segfault'a neden olabilir . DOS bunu yalnızca kabul eder (8086'da bellek yönetimi yoktur, hata için anlamlı bir bölüm yoktur) ve 64 bit Windows çalışmayı reddeder (x86-64'te bir .com dosyasını çalıştırmak için v86 moduna sahip değildir).


13

beyin tıkanması (2)

<.

Evet, bu uygulamaya bağlıdır. SIGSEGV muhtemelen iyi bir derleyiciden kaynaklanıyor.


4
Bu "iyi" den ayrılan bir derleyici nasıl? Bunun bir <etkisi olmamalı veya etrafına sarılmalıdır.
nyuszika7h

12
Sınır ihlalinde hemen bir çalışma zamanı hatası üretmek en iyisidir, çünkü programcının hatayı olabildiğince hızlı bulup düzeltmesini sağlar. Buggy programının bir süre çalışmasına ve çökmeden önce hatıraların bozulmasına yol açması, sorunu teşhis etmeyi zorlaştırır. Kazanın tamamen önlenmesi, sizin de belirtildiği gibi, en kötüsü; programcı programı “çalışabilir” hale getirebilir ve daha sonra standart derleyiciler ve tercümanlar üzerinde çöktüğünde genel olarak küçük düşürülebilir.
Daniel Cristofani

1
Tersine, çalışma zamanından önce sınır ihlallerini yakalamak genel olarak mümkün değildir, özellikle de mümkün olduğu durumlarda kullanışlıdır. Daha açıklayıcı bir çalışma zamanı hatası üretmek iyi olur, ancak işletim sisteminin bunu bir segfault olarak yakalaması harikadır çünkü herhangi bir hız maliyeti yoktur. (Net olmadığı takdirde, derleyicinin kendisi farklılık göstermez - sınırları
aşan

4
Bu davranışı ortaya çıkaran ve bu zorluğun yayınlanmasından önce oluşturulmuş bir uygulama sunabilir misiniz? Değilse, bu cevap geçersiz.
Mego

1
Sınır kontrolleri uygulamaya özeldir, bu yüzden üzerinde hata yapacak bazılarının olduğundan eminim. Herhangi bir SIGSEGV olur mu? Şüpheliyim. Soldaki kaydırma dizisine bağlı çok sayıda program vardır. Her iki tarafta da yetiştirilebilir depolamaya sahip olmak oldukça uygun olabilir.
captncraig

12

Haskell, 31

foreign import ccall main::IO()

Bu, GHC ile derlenip çalıştırıldığında bir segfault oluşturur. Yabancı Fonksiyon Arayüzü Haskell 2010 standardında olduğu için hiçbir uzatma bayrakları gerekmez.


10

C - 11 (19) 7 (15) 6 (14) 1 karakter, AT&T x86 montajcısı - 8 (24) karakter

C sürümü:

*(int*)0=0;

Tüm program (tamamen ISO uyumlu değil, K & R C olduğunu varsayalım) 19 karakter uzunluğundadır:

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

Assembler varyantı:

orl $0,0

Bütün program 24 karakter uzunluğundadır (sadece değerlendirme için, aslında bir montaj aracı olmadığı için):

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

EDIT :

Birkaç C değişkeni. İlki, global pointer değişkeninin sıfır başlatılmasını kullanır:

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

İkincisi sonsuz özyineleme kullanır:

main(){main();}

Son değişken, en kısa olan - 7 (15) karakterdir.

EDIT 2 :

6 (14) karakterden herhangi birinden daha kısa olan bir değişken daha icat etti. Değişmez karakter dizilerinin salt okunur bir bölüme yerleştirildiğini varsayar.

main(){*""=0;}

EDIT 3 :

Ve son denemem - 1 karakter uzunluğunda:

P

Sadece böyle derleyin:

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

3
C ana değil ; sadece 5 karakter
Arya

1
: Linker, ana fonksiyonun çalışıp çalışmadığını kontrol etmez. Sadece yükleyiciye iletin
Arya

1
@ FUZxxl Bu durumda mainsıfırdan başlatılmış bir global int değişkenidir, bu yüzden elde ettiğimiz şey bazı sıfır baytları çalıştırmaya çalışmaktır. X86'da add %al,(%rax)depolanan adreste belleğe ulaşmaya çalışan mükemmel geçerli bir talimat gibi bir şey olurdu %rax. İyi bir adrese sahip olma şansı çok az.
Alexander Bakulin

6
Tabii ki, son giriş her şey için kullanılabilir, sadece doğru derleyici argümanlarını sağlamanız gerekir. Hangi kod golf yarışmasının otomatik galibi yapmalı. :-)
celtschk

5
Genellikle kullanılacak dil sürümünü seçenlerin dışındaki derleyici bayrakları toplam olarak sayılır.
Jerry Jeremiah

9

dc - 7 karakter

[dx0]dx

yığın taşmasına neden olur


İşe yarıyor mu, ancak ayrıntılı olabilir misiniz? Neden bu şekilde davranıyor?
Stéphane Gourichon 21:16

2
[dx0]dx0yığın üzerinde depolar , sonra düst yığın elemanını çoğaltır, ardından xüst yığın elemanını ( dx0) çıkar ve çalıştırır. Bu, üst yığın elemanını çoğaltır ve çalıştırmaya başlar ... 0bunun bir kuyruk çağrısı olmasını önlemek için orada olmaları gerekir, böylece hepsi oluşturulur.
Ben Millwood

8

Perl, 10/12 karakter

Biraz aldatıcı bir çözüm, Joey Adams'ın bas numarasında bir kömürü tıraş etmek :

kill 11,$$

Ancak, Perl’de gerçek bir fark yaratabilmek unpack piçin açık bir çözüm var:

unpack p,1x8

Teknik olarak, bu işlemin kesilmesi garanti edilmez , çünkü 0x31313131 (veya 64-bit sistemlerdeki 0x3131313131313131) adresi yalnızca geçerli adres alanını tesadüfen işaret edebilir. Fakat ihtimaller buna karşı. Ayrıca, perl, işaretçilerin 64 bitten daha uzun olduğu platformlara taşınıyorsa, x8artırılması gerekecektir.


1
Bu nedir 1x8?
Hannes Karppila

@HannesKarppila Yazmak için kısa bir yol"11111111".
Ilmari

8

Python 33

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

Python'da sinyal gönderme 11 (SIGSEGV).


2
Ayrıca 33 karakter: from os import*vekill(getpid(),11)
Timtech

8

OCaml, 13 bayt

Obj.magic 0 0

Bu Obj.magic, herhangi iki tipe güvenli olmayan bir şekilde baskı yapan işlevi kullanır . Bu durumda, 0'ı (GC tarafından kullanılan etiket bitinden dolayı hemen değer 1 olarak depolanır) bir fonksiyon tipine (işaretçi olarak depolanır) zorlar. Bu nedenle, adres 1'den vazgeçmeye çalışır ve bu elbette farklılaşacaktır.


1
it coerces 0 (stored as the immediate value 1)- 0 neden 1 olarak saklanıyor?
Skyler

1
@Skyler bkz. Düzenleme
Demi

1
Obj.magic()0bir karakter daha kısa :)
Ben Millwood

8

Bash, 4 bayt

golfed

. $0

Tekrar tekrar komut dosyasını kendi içine dahil edin.

Açıklaması

Özyinelemeli "kaynak" (.) İşlemi sonunda bir yığın taşmasına neden olur ve Bash libsigsegv ile bütünleşmediğinden , bu bir SIGSEGV ile sonuçlanır.

Bunun bir hata değil, burada tartışıldığı gibi beklenen bir davranış olduğunu unutmayın .

Ölçek

./bang 
Segmentation fault (core dumped)

Çevrimiçi Deneyin!


8

Aslında , 17 16 11 10 9 bayt

⌠[]+⌡9!*.

Çevrimiçi deneyin!

Yukarıdakiler çarpışmazsa, sayıyı artırmayı deneyin (çok basamaklı sayılar Aslında önde gelen iki nokta ile belirtilir)

Yorumlayıcıyı pythonda, gerçekte operatörü uygulamak için kullanılan derinden iç içe geçmiş nesneleri içeren bir hatadan yararlanarak çökertir .itertools.chain+


7

C # - 62

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

Düzenleme: 23

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

Bunun çalışması için / güvensiz ile derlenmelidir. Nedense anlamıyorum, *(int*)0=0sadece NullReferenceException atarken, bu sürüm uygun erişim ihlali verir.


int i=*(int*)0;Döner benim için NullReferenceException.
Peter Olson

Olumsuz bir konuma erişmeyi deneyebilir, *(int*)-1=0erişim ihlali gibi.
Peter Olson

Özel istisna, clr'nin içine sardığı şeydir ve önemsizdir. Os kendisi aslında tüm bu durumlarda seg hatası verir.
captncraig

*(int*)0=0İstisna atma sebebi optimizasyondan kaynaklanıyor olabilir. Spesifik olarak, kontrol maliyetinden kaçınmak için null, optimizer boş kontrolleri kaldırabilir, ancak bir segfault meydana geldiğinde uygun bir şekilde yeniden test edebilir NullReferenceException.
Konrad Borowski

7

PicoLisp - 4 karakter

$ pil
: ('0)
Segmentation fault

Bu amaçlanan davranıştır. Web sitelerinde açıklandığı gibi:

Bazı programlama dilleri "İsviçre Çakısı Programlama Ordusu" olarak nitelendiriliyorsa, PicoLisp "Programlama Neşteri" olarak adlandırılabilir: Keskin, doğru, küçük ve hafif, aynı zamanda deneyimsizlerin elinde de tehlikeli.


7

F90 - 39 bayt

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

Derleme:

gfortran segv.f90 -o segv 

Yürütme:

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

Malzemeler:

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

1
Güzel ilk mesaj.
Rɪᴋᴇʀ

6

C 'de 19 karakter

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

Ana fonksiyonun dönüş adres değerini bozar, bu yüzden dönüşünde SIGSEGV alır main.


Yığın çerçeve düzenine bağlı olduğundan, bazı mimarilerde muhtemelen başarısız olamaz.
Alexander Bakulin

6

J (6)

memf 1

memfboş hafıza anlamına gelir, 1işaretçi olarak yorumlanır.


5

Cython, 14

Bu genellikle hata ayıklama amaçları için kullanışlıdır.

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

5

Unix PDP-11 montajı, 18 bayt ikili, 7 bayt kaynak

(bu benimle bir tema haline geliyor, belki de burada kimsenin bilmediği türden bir dil bildiğim için)

inc(r0)

Program başlangıcından itibaren, r0 [değerinin ayıklayıcısına göre 05162 olur] başlangıç ​​değeri ile adreslenen tek baytı artırır.

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

Ve her zaman olduğu gibi, uçtaki yabancı baytlar şerit ile çıkarılabilir.

Kaynağı kısaltmak için birkaç girişimde bulundum, ancak her zaman bir sözdizimi hatası veya SIGBUS almaya başladım.


5

Matlab - Evet mümkün!

Bir soruya cevaben , Amro bu tuhaflıkla karşılaştı:

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

Lütfen Matlab versiyonunu verin - R2015B (ve 2016B ayrıca) sadece bir hata veriyor: Setfield kullanılırken hata (satır 56) En az bir dizin gerekiyor.
Florian Castellane

@FlorianCastellane Artık tüm sürümleri deneyemiyoruz, ancak en son 2014b ve en erken 2012a olmak üzere bazı sürümlerde segfault verildiği doğrulandı.
Dennis Jaheruddin

5

JavaScript Kabuğu, 7 bayt

clear()

Sadece herşeyi temizler, sadece JS'nin patlaması ve segfaulting olmasıyla sonuçlanan çok fazla borca ​​neden olan mevcut kapsamı değil


MDN'e göre (document.clear), bu yalnızca Mozilla'nın gerçekten eski sürümlerinde bir şeyler yapmalı ve o zaman bile, deneyiminizde gerçekten hangi faktörler var?
saat

Bu window.clear olduğu @tomsmeding, FF doğrudan açığa vurmaz, bu yerleşik bir spidermonkey var
Downgoat

5

Pyth, 3 karakter

j1Z

Bu, meşru bir şekilde hiçbir fikrim olmadığı sürece, bu cevabı nasıl bulduğumu açıklayacağım kısım olacaktır . Bunu benim için açıklayabilirseniz minnettar olurum.

İşte bir çevrimiçi tercüman.

açıklama

jkaideyi kareler ve taban en az sayı kadar büyük olana kadar özyinelemeli olarak çağırır. Taban 0 olduğu için bu asla olmaz. Yeterince yüksek özyinelemeli bir limit ile, bir segfault olsun.

- Dennis


Bir şey buldum! Pyth en kaynağını gezen itibaren bu kod yaptığı tespit jüzerinde 1ve 0hangi çalışır dönüştürmek için 1üs haline 0. Neden bu segfaults, hiçbir fikrim yok ...
Hayır

1
Buraya bakınız . jkaideyi kareler ve taban en az sayı kadar büyük olana kadar özyinelemeli olarak çağırır. Taban 0 olduğu için bu asla olmaz. Yeterince yüksek özyinelemeli bir limit ile, bir segfault olsun.
Dennis,

@Dennis IDEone
NoOneIsHere

@SeeRhino Pyth yorumlayıcısı özyineleme sınırını 100.000 olarak ayarlar. En azından TIO'da, bir segfault için bu yeterli.
Dennis,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.