किसी भी प्रोग्रामिंग भाषा में सेगमेंटेशन फ़ॉल्ट (SIGSEGV) उठाने वाला सबसे छोटा कोड लिखें ।
किसी भी प्रोग्रामिंग भाषा में सेगमेंटेशन फ़ॉल्ट (SIGSEGV) उठाने वाला सबसे छोटा कोड लिखें ।
जवाबों:
main;
यह एक चर घोषणा है - int
प्रकार निहित है (बी भाषा से कॉपी की गई सुविधा) और 0
डिफ़ॉल्ट मान है। जब इसे निष्पादित किया जाता है तो एक संख्या (संख्या निष्पादन योग्य नहीं होती है), और कारणों को निष्पादित करने की कोशिश करता है SIGSEGV
।
0
। static
चर के रूप में शुरू 0
, और main;
है static
, के रूप में मैं इसे बाहर समारोह की घोषणा की। c-faq.com/decl/initval.html
main
एक इंट है, यह स्थित है .bss
, आमतौर पर फ़ंक्शन में स्थित होते हैं .text
, जब कर्नेल योगिनी कार्यक्रम को लोड करता है तो यह एक .text
गैर के लिए एक निष्पादन योग्य पृष्ठ बनाता है के लिए -executable .bss
, इसलिए मुख्य कॉल करके, आप एक गैर-निष्पादन योग्य पृष्ठ पर जाते हैं, और ऐसे पृष्ठ पर कुछ निष्पादित करना एक सुरक्षा दोष है।
main __attribute__((section(".text#")))=0xc3;
एफटीएफवाई (कम से कम यह मेरे x86 पर दुर्घटनाग्रस्त हुए बिना लौटना प्रतीत होता है)।
const main=195;
,। जैसा कि दिलचस्प है कि यह काम कर रहा है, इस कोड गोल्फिंग चुनौती का लक्ष्य कोड segfault बनाना था, काम नहीं :)।
kill -11 $$
RET
यह कोड segfaults है।
exec'()'*7**6
विंडोज c00000fd (स्टैक ओवरफ्लो) के एक त्रुटि कोड की रिपोर्ट करता है जो मुझे लगता है कि विभाजन दोष का एक उपप्रकार है।
एलेक्स ए और मेगो के लिए धन्यवाद, यह मैक और लिनक्स सिस्टम पर भी विभाजन दोष पैदा करने की पुष्टि करता है। अजगर आपके कार्यक्रमों को आंशिक रूप से दुर्घटनाग्रस्त करने के लिए पसंद की भाषा है।
Segmentation fault: 11
मैक पर
Segmentation fault (core dumped)
लिनक्स पर
\def~#1{\meaning}\write0{\expandafter~\string}\bye
यह वास्तव में शायद एक बग है , लेकिन यह मूल टीएक्स में मौजूद नहीं है, जिसे नूथ द्वारा लिखा गया है: कोड को संकलित करने के tex filename.tex
बजाय pdftex filename.tex
एक सेगफॉल्ट का उत्पादन नहीं करता है।
OBTW
ऑनलाइन काम नहीं करता है, केवल सी दुभाषिया में।
>>> 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
में एक फ़ंक्शन होता है इंट, इंट तर्क ले रहा है, इसलिए यह काम करता है (भले ही कंपाइलर शिकायत करता है)।
/(?{??})/
5.14 में रेगेक्स इंजन को फिर से बनाया गया था ताकि इसे इस तरह से दुर्घटनाग्रस्त न किया जा सके, लेकिन अगर आप यह कोशिश करते हैं तो 5.12 और इससे पहले का सीगफॉल्ट होगा।
यह अजीब लगेगा, लेकिन 32 बिट विंडोज सिस्टम पर, एक खाली .com फ़ाइल बनाने और निष्पादित करने से एक सेगफॉल्ट हो सकता है, जो ... कुछ पर निर्भर करता है। डॉस सिर्फ इसे स्वीकार करता है (8086 में कोई मेमोरी मैनेजमेंट नहीं है, इसमें कोई भी गलत सेगमेंट नहीं है), और 64 बिट विंडोज इसे चलाने से इनकार करते हैं (x86-64 में कोई .86 फ़ाइल चलाने के लिए कोई v86 मोड नहीं है)।
<.
हां, यह कार्यान्वयन-निर्भर है। SIGSEGV एक अच्छे संकलक से संभावित परिणाम है।
<
या तो कोई असर नहीं होना चाहिए या चारों ओर लपेटना चाहिए।
सी संस्करण है:
*(int*)0=0;
पूरा कार्यक्रम (काफी आईएसओ-अनुरूप नहीं है, मान लें कि यह K & R C है) 19 वर्ण लंबा है:
main(){*(int*)0=0;}
कोडांतरक प्रकार:
orl $0,0
पूरा कार्यक्रम 24 वर्ण लंबा है (केवल मूल्यांकन के लिए, क्योंकि यह वास्तव में कोडांतरक नहीं है):
main(){asm("orl $0,0");}
संपादित करें :
C वेरिएंट की एक जोड़ी। वैश्विक पॉइंटर वैरिएबल के पहले शून्य-प्रारंभिक उपयोग का उपयोग करता है:
*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
में एक शून्य-आरंभिक वैश्विक int वैरिएबल है, इसलिए हमें जो कुछ मिलता है वह कुछ शून्य बाइट्स निष्पादित करने का प्रयास करने का एक परिणाम है। X86 में यह कुछ ऐसा होगा add %al,(%rax)
जो पूरी तरह से वैध निर्देश है जो मेमोरी में संग्रहीत पते पर पहुंचने की कोशिश करता है %rax
। एक अच्छा पता होने की संभावनाएं कम से कम हैं।
[dx0]dx
एक ढेर अतिप्रवाह का कारण बनता है
[dx0]
dx0
स्टैक पर स्टोर , फिर d
शीर्ष स्टैक तत्व को डुप्लिकेट करता है, फिर x
शीर्ष स्टैक तत्व ( dx0
) को पॉप करता है और इसे निष्पादित करता है। जो शीर्ष स्टैक तत्व को डुप्लिकेट करता है, और इसे निष्पादित करना शुरू कर देता है ... 0
पूंछ कॉल होने से रोकने के लिए वहां होने की आवश्यकता है, इसलिए वे सभी का निर्माण करते हैं।
एक थोड़ा cheatish समाधान बंद एक चार दाढ़ी बनाने के लिए है जॉय 'एडम्स बैश चाल :
kill 11,$$
हालांकि, पर्ल में एक वास्तविक सेगफॉल्ट प्राप्त करने के लिए, unpack p
स्पष्ट समाधान है:
unpack p,1x8
तकनीकी रूप से, यह सेगफॉल्ट की गारंटी नहीं है , क्योंकि पता 0x31313131 (या 0x3131313131313131 64-बिट सिस्टम पर) बस संयोग से वैध पते के स्थान को इंगित कर सकता है। लेकिन बाधाओं इसके खिलाफ हैं। इसके अलावा, यदि पर्ल को कभी उन प्लेटफ़ॉर्म पर पोर्ट किया गया है जहाँ पॉइंटर्स 64 बिट्स से अधिक हैं, तो x8
इच्छा को बढ़ाना होगा।
1x8
चीज है?
"11111111".
Obj.magic 0 0
यह फ़ंक्शन का उपयोग करता है Obj.magic
, जो किसी भी दो प्रकारों को अनसुना करता है । इस स्थिति में, यह 0 (तत्काल मान 1 के रूप में संग्रहीत, जीसी द्वारा उपयोग किए जाने वाले टैग बिट के कारण) एक फ़ंक्शन प्रकार (एक पॉइंटर के रूप में संग्रहीत) के कारण होता है। इस प्रकार, यह पता 1 को निष्क्रिय करने की कोशिश करता है, और निश्चित रूप से सेगफॉल्ट होगा।
it coerces 0 (stored as the immediate value 1)
- 0 को 1 के रूप में क्यों संग्रहीत किया जाता है?
Obj.magic()0
एक चार छोटा है :)
golfed
. $0
पुन: स्क्रिप्ट को अपने आप में शामिल करें।
व्याख्या की
पुनरावर्ती "स्रोत" (।) ऑपरेशन अंततः एक स्टैक अतिप्रवाह का कारण बनता है, और जैसा कि बैश लिबासिगसेव के साथ एकीकृत नहीं करता है , इसके परिणामस्वरूप एक SIGSEGV होता है।
ध्यान दें कि यह एक बग नहीं है, लेकिन एक अपेक्षित व्यवहार है, जैसा कि यहां चर्चा की गई है ।
परीक्षा
./bang
Segmentation fault (core dumped)
⌠[]+⌡9!*.
यदि उपरोक्त क्रैश नहीं करता है, तो संख्या बढ़ाने की कोशिश करें (बहु-अंक संख्या वास्तव में एक अग्रणी बृहदान्त्र के साथ निर्दिष्ट हैं)
अजगर में एक बग का शोषण करके दुभाषिया को itertools.chain
नष्ट कर देता है जिसमें गहरी नेस्टेड ऑब्जेक्ट शामिल होते हैं, जो वास्तव में +
ऑपरेटर को लागू करने के लिए उपयोग करता है ।
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
unsafe{int i=*(int*)0;}
यह काम करने के लिए / असुरक्षित के साथ संकलन करना चाहिए। किसी कारण से मुझे समझ नहीं आ रहा है, *(int*)0=0
बस एक NullReferenceException को फेंकता है, जबकि यह संस्करण उचित पहुंच उल्लंघन देता है।
int i=*(int*)0;
रिटर्न मेरे लिए एक NullReferenceException।
*(int*)-1=0
और एक पहुँच उल्लंघन प्राप्त कर सकते हैं।
*(int*)0=0
एक अपवाद फेंकता अनुकूलन के कारण संभावना है। विशेष रूप से, के लिए जाँच की लागत से बचने के लिए null
, ऑप्टिमाइज़र अशक्त जाँच को हटा सकता है, लेकिन जब एक segfault होता है तो इसे उचित के रूप में पुनर्व्यवस्थित कर सकता है NullReferenceException
।
$ pil
: ('0)
Segmentation fault
यह अभिप्रेत व्यवहार है। जैसा कि उनकी वेबसाइट पर वर्णित है:
यदि कुछ प्रोग्रामिंग लैंग्वेज "स्विस आर्मी नाइफ ऑफ़ प्रोग्रामिंग" होने का दावा करती हैं, तो पिको लिस्प को "स्कैलपेल ऑफ़ प्रोग्रामिंग" कहा जा सकता है: तीव्र, सटीक, छोटे और हल्के, लेकिन अनुभवहीन के हाथ में भी खतरनाक।
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)
आर 0 के प्रारंभिक मूल्य द्वारा संबोधित एकल बाइट में वृद्धि [जो कि प्रोग्राम डेब्यू के अनुसार सिंघ डीबगर के अनुसार 05162] होती है।
0000000 000407 000002 000000 000000 000000 000000 000000 000000
0000020 005210 000000
और, हमेशा की तरह, अंत में बाहर निकलने वाली बाइट्स को पट्टी के साथ हटाया जा सकता है।
मैंने स्रोत को छोटा करने के लिए कुछ प्रयास किए, लेकिन हमेशा सिंटैक्स त्रुटि या SIGBUS प्राप्त करना समाप्त कर दिया।
मेरे एक सवाल के जवाब में , अमरो इस क्विक के साथ आया:
S = struct();
S = setfield(S, {}, 'g', {}, 0)
clear()
पूरी तरह से सब कुछ साफ हो जाता है, न कि केवल वर्तमान गुंजाइश जो स्पष्ट रूप से बहुत सारे बर्क का कारण बनती है जिसके परिणामस्वरूप जेएस उड़ता है और सेगफॉल्टिंग होता है
j1Z
यह वह हिस्सा होगा जहां मैं समझाता हूं कि मैं इस उत्तर के साथ कैसे आया, इसके अलावा मेरे पास वैध रूप से कोई सुराग नहीं है । अगर कोई मेरे लिए यह समझा सकता है, तो मैं आभारी रहूंगा।
यहाँ यह एक ऑनलाइन दुभाषिया में है।
व्याख्या
j
आधार को वर्ग बनाता है और तब तक खुद को पुनरावर्ती कहता है जब तक कि आधार संख्या के रूप में कम से कम नहीं हो। चूंकि आधार 0 है , ऐसा कभी नहीं होता है। पर्याप्त रूप से उच्च पुनरावर्तन सीमा के साथ, आपको एक सेगफॉल्ट मिलता है।
j
है 1
और 0
, जो आधार में बदलने की कोशिश करता है । क्यों उस segfaults, मुझे पता नहीं है ...1
0