2010-09-22 7 views
5

मुझे लगता है कि चारों ओर सी # कोड के कम से कम, neatest टुकड़ा मज़बूती से एक segfault का उत्पादन करेगा में दिलचस्पी है।क्या है? सीधे किसी भी अप्रबंधित कोड बुला बिना आदर्श -

+1

संभावना नहीं होने के लिए। प्रबंधित कोड में सेगफॉल्ट का मतलब जेआईटी/रनटाइम में एक बग और कुछ स्थितियों में एक भेद्यता होगी। यदि यह संभव है, तो इसे जल्द ही तय किया जा रहा है-आश। – viraptor

+0

यह करने के लिए एक पूरा compilable जवाब केवल एक दर्जन से अधिक लाइनों के बारे में होना चाहिए। –

+0

@viraptor: नहीं, क्रम विभाजन गलती (Windows पर शब्द "पहुँच उल्लंघन" है) को संभालने और एक NullPointerException फेंक सकता है, लेकिन है कि कभी नहीं एक विभाजन गलती होने के रूप में एक ही नहीं है। 'System.Runtime: आप सभी की जरूरत से संदिग्ध कोड (सी # में, इसका मतलब है कि'/संकलन unsafe') –

उत्तर

7

आप के बाद क्या कर रहे हैं कुछ हद तक स्पष्ट नहीं है, लेकिन मुझे लगता है कि यह अब तक किसी भी जवाब के रूप में के रूप में अच्छा है, और इसके बारे में के रूप में कम से कम के रूप में आप प्राप्त कर सकते है।

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

+0

हां, धन्यवाद। यही वह था जो मैं बाद में था। – Tom

0

/unsafe विकल्प के साथ csc साथ संकलित:

class Program 
{ 
    static void Main(string[] args) 
    { 
     unsafe 
     { 
      int *p = null; 
      *p = 5; 
     } 
    } 
} 
+2

कि वास्तव में एक NullReferenceException है, जो आसान सादे पुराने नेट के साथ पाने के लिए पर्याप्त है फेंकता है। मुझे लगता है कि ओपी एक AccessViolationException की तरह कुछ और के बाद है। –

+0

कवर के तहत एक पहुँच उल्लंघन (देशी अपवाद कोड 0xc0000005) NULL संकेतक भिन्नता जो तब 'System.NullReferenceException' का एक उदाहरण में CLR में फंस और अनुवाद किया है से परिणाम। –

0

ऊपर टिप्पणी में बताया गया है, वहाँ Windows में एक segfault जैसी कोई चीज नहीं है, और आप लिनक्स पर मोनो के बारे में कुछ नहीं कहा। तो मैं मानता हूं कि आप वास्तव में एक प्रवेश उल्लंघन का मतलब है।

यहाँ एक तरह से प्राप्त करने के लिए है एक:

unsafe { 
    int* a = (int*) -4; 
    *a = 0; 
} 

(/unsafe विकल्प के साथ संकलित किया जाना चाहिए।)

मेरे पहली कोशिश पते के रूप में इस्तेमाल किया 0, लेकिन यह एक सादे पुराने फेंकने के लिए निकला NullReferenceException, जिसे आप असुरक्षित कोड के बिना प्राप्त कर सकते हैं। लेकिन नकारात्मक पते को मेरे Vista x64 बॉक्स पर AccessViolationException मिलता है।

+0

दिलचस्प बात यह है कि लिनक्स के तहत चल रहे मोनो 1.9.1 पर 'NullReferenceException' में परिणाम होता है, इसलिए मुझे लगता है कि यह आर्किटेक्चर-निर्भर है (या मोनो इसे गलत समझता है!)। –

+0

धन्यवाद। जहां तक ​​शब्दावली का सवाल है, मैं एक "प्रवेश उल्लंघन" को एक सेगफॉल्ट कहने से खुश हूं - हमेशा रहा है। – Tom

0

माइकल के जवाब मेरे लिए काम नहीं कर रहा था, शायद उस मामले अब पकड़ा है। मार्शल.रेडइन्ट 32() बस मुझे "सिस्टम एरर: सुरक्षित स्मृति पढ़ने या लिखने का प्रयास करता है।" विभिन्न पास मूल्यों के लिए विंडोज़ पर .NET 4.5 के साथ। मैं तथापि निम्नलिखित इस्तेमाल किया जो विंडोज पर और मोनो 4.0.4.1 के तहत मुझे दोनों के लिए segfaults:

using System.Runtime.InteropServices; 

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
    public delegate void UNMANAGED_CALLBACK(); 

    public void Crash() 
    { 
     var crash = (UNMANAGED_CALLBACK)Marshal.GetDelegateForFunctionPointer((IntPtr) 123, typeof(UNMANAGED_CALLBACK)); 
     crash(); 
    } 
संबंधित मुद्दे