Herhangi bir programlama dilinde bir Segmentasyon Hatası (SIGSEGV) oluşturan en kısa kodu yazın .
Herhangi bir programlama dilinde bir Segmentasyon Hatası (SIGSEGV) oluşturan en kısa kodu yazın .
Yanıtlar:
main;
Değişken bir bildirimdir - int
tür ima edilir (B diline kopyalanan özellik) ve 0
varsayı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
.
0
. static
değişkenler olarak başlar 0
ve main;
bir static
ben dışarıda fonksiyonu bunu deklare olarak. c-faq.com/decl/initval.html
main
bir int, bu yer alır olduğunu .bss
genellikle fonksiyonları bulunmaktadır, .text
çekirdek bunun için yürütülebilir bir sayfası oluşturur elf programı yüklediğinde, .text
sigara -ö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.
main __attribute__((section(".text#")))=0xc3;
FTFY (en azından x86'ma çarpmadan dönüyor gibi görünüyor).
const main=195;
. İşin ilginç olması, bu kod golfünün zorluğunun amacı kodun çalışmamasını sağlamak :)
kill -11 $$
RET
Bu kod segfaults.
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.
Segmentation fault: 11
Mac
Segmentation fault (core dumped)
Linux'ta
\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.tex
yerine derlemek pdftex filename.tex
bir segfault üretmez.
OBTW
Çevrimiçi çalışmaz, yalnızca C yorumlayıcısında.
>>> import ctypes;ctypes.string_at(0)
Segmentation fault
Kaynak: http://bugs.python.org/issue1215#msg143236
>>> 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 ...
main(){raise(11);}
int func()
. yani int
belirtilmemiş parametreler alarak bir fonksiyon döndürme . Bu durumda raise
int döndüren, int argümanını alan bir işlevdir, bu nedenle bu derlenir (derleyici şikayet ederse).
/(?{??})/
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.
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).
<.
Evet, bu uygulamaya bağlıdır. SIGSEGV muhtemelen iyi bir derleyiciden kaynaklanıyor.
<
etkisi olmamalı veya etrafına sarılmalıdır.
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.
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
main
sı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.
[dx0]dx
yığın taşmasına neden olur
[dx0]
dx0
yığı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 ... 0
bunun bir kuyruk çağrısı olmasını önlemek için orada olmaları gerekir, böylece hepsi oluşturulur.
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 p
iç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, x8
artırılması gerekecektir.
1x8
?
"11111111".
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.
it coerces 0 (stored as the immediate value 1)
- 0 neden 1 olarak saklanıyor?
Obj.magic()0
bir karakter daha kısa :)
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)
⌠[]+⌡9!*.
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
+
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
unsafe{int i=*(int*)0;}
Bunun çalışması için / güvensiz ile derlenmelidir. Nedense anlamıyorum, *(int*)0=0
sadece NullReferenceException atarken, bu sürüm uygun erişim ihlali verir.
int i=*(int*)0;
Döner benim için NullReferenceException.
*(int*)-1=0
erişim ihlali gibi.
*(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
.
$ 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.
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
main(a){*(&a-1)=1;}
Ana fonksiyonun dönüş adres değerini bozar, bu yüzden dönüşünde SIGSEGV alır main
.
(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.
Bir soruya cevaben , Amro bu tuhaflıkla karşılaştı:
S = struct();
S = setfield(S, {}, 'g', {}, 0)
clear()
Sadece herşeyi temizler, sadece JS'nin patlaması ve segfaulting olmasıyla sonuçlanan çok fazla borca neden olan mevcut kapsamı değil
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.
açıklama
j
kaideyi 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.
j
üzerinde 1
ve 0
hangi çalışır dönüştürmek için 1
üs haline 0
. Neden bu segfaults, hiçbir fikrim yok ...