C ++ प्रोग्राम क्रैश करने का सबसे आसान तरीका क्या है?


318

मैं एक पायथन प्रोग्राम बनाने की कोशिश कर रहा हूं जो एक अलग दुर्घटनाग्रस्त प्रक्रिया के साथ इंटरफेस करता है (जो मेरे हाथों से बाहर है)। दुर्भाग्य से, मैं जिस कार्यक्रम में हस्तक्षेप कर रहा हूं, वह भी विश्वसनीय रूप से दुर्घटनाग्रस्त नहीं होता है! इसलिए मैं एक त्वरित सी ++ प्रोग्राम बनाना चाहता हूं जो उद्देश्य से दुर्घटनाग्रस्त हो जाता है लेकिन मैं वास्तव में ऐसा करने का सबसे अच्छा और छोटा तरीका नहीं जानता, क्या कोई जानता है कि मेरे बीच क्या रखा जाए:

int main() {
    crashyCodeGoesHere();
}

मेरे C ++ प्रोग्राम को मज़बूती से बनाने के लिए


4
आप निजी निर्देशों को निष्पादित करने के प्रयास के लिए इनलाइन असेंबली का उपयोग कर सकते हैं:asm { cli; };
नैट कोपेनहेवर

@aitchnyu मुझे लगता है कि प्रत्येक प्रश्न के उत्तर की प्रयोज्यता में अंतर है। (FYI करें: मैंने किसी भी प्रश्न के लिए कुछ भी वोट नहीं दिया है)
एंड्रयू नाई

अपवाद को फेंकने की कोई टिप्पणी जबकि कोई पहले से ही प्रचार करता है ?? plz chk नीचे मेरा जवाब anc comment
अभिनव

4
Redis *((char*)-1) = 'x';मेरे जवाब
Shafik Yaghmour

मुझे यह सवाल क्रैश रिपोर्टिंग सिस्टम के लिए एक परीक्षण मामले की खोज में मिला। मुझे क्रैश रिपोर्टर और स्टैक डंप भेजने के लिए सामान्य रनटाइम के दौरान एक दुर्घटना को मजबूर करने की आवश्यकता थी। धन्यवाद!
Cory Trese

जवाबों:


264

abort()समारोह शायद आपका सर्वश्रेष्ठ दांव है। यह सी मानक पुस्तकालय का हिस्सा है, और इसे "असामान्य कार्यक्रम समाप्ति के कारण" के रूप में परिभाषित किया गया है (उदाहरण के लिए, एक घातक त्रुटि या दुर्घटना)।


14
ध्यान दें कि के माध्यम से एक दुर्घटना abort()किसी भी विध्वंसक या atexitकार्यों को नहीं बुलाती है , हालांकि यह यहां कोई फर्क नहीं पड़ेगा।
Xeo

139
@ Xeo: अगर यह विध्वंसक और atexitएस को बुलाता है , तो यह दुर्घटना नहीं होगी?
डोनल फैलो

चूंकि abort()सही उत्तर है, तो 'बाहर निकलें (-1)? `स्वीकार्य होना चाहिए?
asir6

9
नहीं, क्योंकि इससे कोई दुर्घटना नहीं होती है, केवल कुछ रिपोर्ट नहीं की जा सकती है।
नावक

खिड़कियाँ। जीसीसी-5.4.0। बाहर निकलें कोड: 3. कोई त्रुटि संदेश बॉक्स। कंसोल संदेश: "इस एप्लिकेशन ने असामान्य तरीके से इसे समाप्त करने के लिए रनटाइम से अनुरोध किया है। कृपया अधिक जानकारी के लिए एप्लिकेशन के समर्थन से संपर्क करें।"
वडज़िम

113

प्रयत्न:

raise(SIGSEGV);  // simulates a standard crash when access invalid memory
                 // ie anything that can go wrong with pointers.

में पाया:

#include <signal.h>

3
यह केवल कार्यान्वयन-परिभाषित से अधिक है - संकेत के साथ पकड़ा जा सकता है signal()। हालांकि अधिकांश समझदार अनुप्रयोग नहीं हैं।
डस्कवफ-एक्टिव-

12
यह अनुप्रयोग के भीतर एक सामान्य SIGSEGV के रूप में ठीक उसी तरह से दुर्घटनाग्रस्त हो जाएगा (जिस तरह से अधिकांश एप्लिकेशन क्रैश होते हैं)। यह अच्छी तरह से परिभाषित है कि यह क्या करता है (डिफ़ॉल्ट रूप से यह एप्लिकेशन से बाहर निकलता है और एक कोर फ़ाइल उत्पन्न करता है)। हाँ, आप एक हैंडलर सेट कर सकते हैं, लेकिन अगर आपके पास कोई है तो आप उसी तरह से परीक्षण नहीं करना चाहते हैं !!
मार्टिन यॉर्क

1
के लिए +1 raise()। यह आपको केवल तर्क बदलकर विभिन्न प्रकार के अपवादों के एक टन के लिए परीक्षण करने देता है।

3
पसंदीदा समाधान, हालांकि यह मंच पर निर्भर है।
नादिम फरहत

@NadimFarhat: किस तरह से। एक संकेत सभी प्लेटफार्मों पर एक संकेत है।
मार्टिन यॉर्क

74

शून्य से विभाजित करने पर एप्लिकेशन क्रैश हो जाएगा:

int main()
{
    return 1 / 0;
}

29
आपका कंपाइलर कितना चालाक है यह इस बात पर निर्भर करता है कि वह संकलन के समय पकड़ा जाएगा। मुझे पता है कि दृश्य स्टूडियो 2008 सी + + या सी # के लिए इसे संकलित नहीं करेगा।
ऐदानो

2
मैंने इसे संकलित किया है और इसे चलाया है, क्या आप चाहते हैं कि मैं आपको सैंड।
Roee Gavirel

1
2010 जैसे दृश्य स्टूडियो के हाल के संस्करणों में रिलीज कॉन्फ़िगरेशन में, यह समस्या के बिना चलेगा। मुझे लगता है कि यह कुछ अनुकूलन है।
tedyyu

2
iirc यह बांह पर दुर्घटनाग्रस्त नहीं होता है
शेरपा

2
यह अपरिभाषित व्यवहार है और क्रैश की गारंटी नहीं है। अक्सर संकलक अपरिभाषित व्यवहार को अगम्य मान लेते हैं। यह अनुदेश mainसहित पूरी तरह से हटाए जाने के शरीर को जन्म दे सकता है ret। निष्पादन केवल निम्न फ़ंक्शन में आ सकता है।
usr

64
*((unsigned int*)0) = 0xDEAD;

54
यह क्रैश की गारंटी नहीं है।
विंडोज प्रोग्रामर

8
@ Windowsprogrammer: नहीं, इसकी गारंटी नहीं है । लेकिन कौन सा sane OS एक ऐसे एप्लिकेशन को नहीं रोकता है, जो 0 पते पर मेमोरी एक्सेस करने की कोशिश करता है?
जोकिम सॉर

29
"लेकिन कौन सा sane OS एक ऐसे एप्लीकेशन को नहीं रोकता है जो एड्रेस 0 पर मेमोरी एक्सेस करने की कोशिश करता है?" - यह वास्तव में नहीं है कि आप क्या पूछना चाहते हैं, लेकिन मैं वैसे भी जवाब दूंगा। कुछ कंप्यूटरों में पता 0 पर RAM है, और यह एक प्रोग्राम के लिए एक मूल्य को संग्रहीत करने के लिए पूरी तरह से सार्थक है। एक अधिक सार्थक प्रश्न यह होगा कि "कौन सा ओएस एक एप्लिकेशन को उस पते पर स्मृति तक नहीं रोकता है जो एक सी + + कार्यान्वयन एक अशक्त सूचक के लिए आरक्षित है?" उस मामले में मुझे कोई जानकारी नहीं है। लेकिन मूल कार्यक्रम ओएस के बारे में नहीं सी + + भाषा के बारे में है।
विंडोज प्रोग्रामर

6
इसका अपरिभाषित व्यवहार। इसके लिए कुछ भी नहीं करना पूरी तरह से ठीक है। एक मशीन जो दुर्घटनाग्रस्त नहीं होगी: Z80 श्रृंखला प्रोसेसर चलाने वाली कोई भी चीज (मेरा मानना ​​है कि (मेरा Z80a कुछ नहीं करता है))।
मार्टिन यॉर्क

28
हालाँकि यह दुर्घटना की गारंटी नहीं है , यह C ++ में दुर्घटना के सबसे सामान्य प्रकारों में से एक है। इसलिए यदि आप किसी दुर्घटना का अनुकरण करना चाहते हैं, तो यह एक "प्रामाणिक" तरीका है :)
क्रिस बर्ट-ब्राउन

53

ठीक है, हम स्टैक ओवरफ्लो पर हैं , या नहीं?

for (long long int i = 0; ++i; (&i)[i] = i);

(किसी भी मानक से दुर्घटना की गारंटी नहीं है, लेकिन न तो स्वीकार किए गए सहित कोई भी सुझाए गए उत्तर हैं, क्योंकि SIGABRTवैसे भी पकड़ा जा सकता है। व्यवहार में, यह हर जगह दुर्घटनाग्रस्त हो जाएगा।)


4
मैं देख सकता हूं कि गैर-संरक्षित कोड पृष्ठों वाले सिस्टम पर मजाकिया होना और आप अपने प्रोग्राम को कुछ कोड के साथ ओवरराइट कर देते हैं जो गलती से एक अनंत लूप है जो कुछ भी नहीं करता है। अत्यधिक अत्यधिक अत्यधिक अत्यधिक संभावना नहीं है लेकिन संभावित रूप से संभव है।
मार्टिन यॉर्क

@ लोकी: अगर यह सिर्फ हर 4000 वें बाइट से पढ़े तो क्या होगा? क्या इससे दुर्घटना की संभावना कम होगी? निश्चित रूप से कम खतरनाक है।
मूविंग डक

70
दुर्घटनाग्रस्त एल्गोरिथ्म ओ (1) नहीं है!
एंटोन बार्कोवस्की

@MooingDuck: मैं सिर्फ एक मजेदार टिप्पणी कर रहा हूं। इसे गंभीरता से न लें :-) लेकिन यह दिलचस्प होगा यदि किसी को निर्देशों का एक अनुक्रम मिला जो कुछ अजीब था।
मार्टिन यॉर्क

1
@ लोकीअस्तारी: आप बिल्कुल सही कह रहे हैं। मैं (&i)[i] += !iइसके बजाय के बारे में सोच रहा था , लेकिन मुझे डर था कि कंपाइलर काफी चालाक हो सकता है और इसे बाहर करना चाहता है। :-)
सम होसेवार

35
 throw 42;

बस जवाब… :)


1
खिड़कियाँ। जीसीसी-5.4.0। बाहर निकलें कोड: 3. कोई त्रुटि संदेश बॉक्स। कंसोल संदेश: "'int' का एक उदाहरण फेंकने के बाद कॉल किया गया समाप्त। इस एप्लिकेशन ने रनटाइम से इसे असामान्य तरीके से समाप्त करने का अनुरोध किया है। कृपया अधिक जानकारी के लिए एप्लिकेशन की सहायता टीम से संपर्क करें।"
वडज़िम

15

assert(false); बहुत अच्छा है।

आईएसओ / आईईसी 9899: 1999 के अनुसार यह दुर्घटना की गारंटी है जब NDEBUG परिभाषित नहीं है:

यदि NDEBUG को परिभाषित किया गया है [...] तो अभिकारक मैक्रो को बस के रूप में परिभाषित किया गया है

#define assert(ignore) ((void)0)

हर बार शामिल किए जाने वाले NDEBUG की वर्तमान स्थिति के अनुसार मुखर मैक्रो को फिर से परिभाषित किया जाता है।

[...]

मुखर मैक्रो कार्यक्रमों में नैदानिक ​​परीक्षण करता है; [...] अगर अभिव्यक्ति (जिसमें एक स्केलर प्रकार होगा) गलत है [...]। यह तो गर्भपात समारोह को बुलाता है।


मैं अस्पष्ट रूप से वीसी 2005 को डिबग और आरोही के साथ रिलीज के बीच अलग तरह से व्यवहार करने के लिए याद करता हूं?
टॉम केर

8
@ टॉम रिलीज मोड के assertबराबर बनाया गया ((void)0)है।
सेठ कार्नेगी

2
@SethCarnegie न तो क्या गलत देख सकता है - केवल अगर परिभाषित NDEBUG परिभाषित इच्छा दुर्घटना नहीं है? Dans का जवाब बहुत अच्छा IMHO था।
एड्रियन कोर्निश

@ AdrianCornish मैं केवल टॉम केर के सवाल का जवाब दे रहा था, यह जवाब गलत नहीं था। मैंने इस उत्तर को अस्वीकार नहीं किया।
सेठ कार्नेगी

3
मुझे नहीं पता कि वह इस परीक्षण कोड का "रिलीज़" निर्माण क्यों करेगा।
जोएल बी

11

चूंकि एक दुर्घटना अपरिभाषित व्यवहार को लागू करने का एक लक्षण है, और चूंकि अपरिभाषित व्यवहार को लागू करने से दुर्घटना भी हो सकती है, मुझे नहीं लगता कि आप वास्तव में अपने कार्यक्रम को दुर्घटनाग्रस्त करना चाहते हैं, लेकिन बस इसे डिबगर में छोड़ दें। ऐसा करने का सबसे पोर्टेबल तरीका शायद है abort()

जबकि raise(SIGABRT)इसका एक ही प्रभाव है, यह निश्चित रूप से लिखना अधिक है। हालाँकि दोनों ही तरीकों के लिए सिग्नल हैंडलर लगाकर इंटरसेप्ट किया जा सकता है SIGABRT। इसलिए आपकी स्थिति के आधार पर, आप एक और संकेत उठाना चाहते हैं / कर सकते हैं। SIGFPE, SIGILL, SIGINT, SIGTERMया SIGSEGVजाने का रास्ता हो सकता है, लेकिन वे सभी पकड़ा जा सकता है।

जब आप अस्थिर हो सकते हैं, तो आपकी पसंद और भी व्यापक हो सकती है, जैसे SIGBUSकि लिनक्स पर उपयोग करना।


1
मुझे वास्तव में संदेह है कि वह एक डिबगर को शामिल करना चाहता है। वह परीक्षण करना चाहता है कि क्या होता है जब दुर्घटनाग्रस्त कार्यक्रम के कॉलर को दुर्घटनाग्रस्त हो जाता है। जो बहुत ही उचित है।
डोनाल्ड फेलो

9

केवल फ़्लैश मैं गर्भपात था () फ़ंक्शन :

यह एक असामान्य प्रोग्राम समाप्ति के साथ प्रक्रिया को निरस्त कर देता है। यह SIGABRT सिग्नल उत्पन्न करता है , जो डिफ़ॉल्ट रूप से प्रोग्राम को होस्ट वातावरण में एक असफल समाप्ति त्रुटि कोड को समाप्त करने का कारण बनता है। कार्यक्रम स्वचालित या स्थिर भंडारण अवधि की वस्तुओं के लिए नियोजक को निष्पादित किए बिना समाप्त किया जाता है। , और बिना किसी एटेक्सिट को बुलाए (जिसे प्रोग्राम समाप्त होने से पहले निकास द्वारा कहा जाता है) फ़ंक्शन। यह कभी भी अपने कॉलर पर नहीं लौटता है।


9

उत्तर प्लेटफ़ॉर्म विशिष्ट है और आपके लक्ष्यों पर निर्भर करता है। लेकिन यहाँ मोजिला जावास्क्रिप्ट क्रैश फंक्शन है, जो मुझे लगता है कि इस काम को करने के लिए बहुत सारी चुनौतियाँ दिखाता है:

static JS_NEVER_INLINE void
CrashInJS()
{
    /*
     * We write 123 here so that the machine code for this function is
     * unique. Otherwise the linker, trying to be smart, might use the
     * same code for CrashInJS and for some other function. That
     * messes up the signature in minidumps.
     */

#if defined(WIN32)
    /*
     * We used to call DebugBreak() on Windows, but amazingly, it causes
     * the MSVS 2010 debugger not to be able to recover a call stack.
     */
    *((int *) NULL) = 123;
    exit(3);
#elif defined(__APPLE__)
    /*
     * On Mac OS X, Breakpad ignores signals. Only real Mach exceptions are
     * trapped.
     */
    *((int *) NULL) = 123;  /* To continue from here in GDB: "return" then "continue". */
    raise(SIGABRT);  /* In case above statement gets nixed by the optimizer. */
#else
    raise(SIGABRT);  /* To continue from here in GDB: "signal 0". */
#endif
}

2
आपको पूरी तरह से छोड़ देना चाहिए और इसके बजाय jQuery का उपयोग करना चाहिए।
थॉमस वेलर

1
यह अपरिभाषित व्यवहार है और क्रैश की गारंटी नहीं है। अक्सर संकलक अपरिभाषित व्यवहार को अगम्य मान लेते हैं। उस स्थिति में कम से कम दुर्घटनाग्रस्त लाइन हटने वाली है और अन्य कोड भी हो सकते हैं।
usr

8

मैं देख रहा हूं कि यहां कई उत्तर पोस्ट किए गए हैं जो काम पाने के लिए भाग्यशाली मामलों में पड़ेंगे, लेकिन उनमें से कोई भी दुर्घटनाग्रस्त होने के लिए 100% नियत नहीं है। कुछ एक हार्डवेयर और ओएस पर दुर्घटनाग्रस्त हो जाएंगे, अन्य नहीं करेंगे। हालाँकि, क्रैश करने के लिए आधिकारिक C ++ मानक के अनुसार एक मानक तरीका है।

से हवाला देते हुए सी ++ मानक आईएसओ / आईईसी 14882 §15.1-7 :

यदि अपवाद हैंडलिंग तंत्र, अपवाद ऑब्जेक्ट के आरंभीकरण को पूरा करने के बाद लेकिन अपवाद के लिए हैंडलर की सक्रियता से पहले, एक फ़ंक्शन को कॉल करता है जो अपवाद के माध्यम से बाहर निकलता है, तो std :: terminate कहा जाता है (15.5.1)।

struct C {
    C() { }
    C(const C&) {
        if (std::uncaught_exceptions()) {
            throw 0; // throw during copy to handler’s exception-declaration object (15.3)
        }
    }
};
int main() {
    try {
    throw C(); // calls std::terminate() if construction of the handler’s
    // exception-declaration object is not elided (12.8)
    } catch(C) { }
}

मैंने इसे प्रदर्शित करने के लिए एक छोटा कोड लिखा है और यहाँ Ideone पर पाया और आजमाया जा सकता है

class MyClass{
    public:
    ~MyClass() throw(int) { throw 0;}
};

int main() {
  try {
    MyClass myobj; // its destructor will cause an exception

    // This is another exception along with exception due to destructor of myobj and will cause app to terminate
     throw 1;      // It could be some function call which can result in exception.
  }
  catch(...)
  {
    std::cout<<"Exception catched"<<endl;
  }
  return 0;
}

आईएसओ / आईईसी 14882 .115.1 / 9 उल्लेख बिना प्रयास किए ब्लॉक को फेंकने के परिणामस्वरूप गर्भपात के लिए निहित है।

यदि कोई अपवाद वर्तमान में संभाला नहीं जा रहा है, तो कोई ऑपरेंड कॉल के साथ थ्रो-अभिव्यक्ति निष्पादित करना std :: terminate ()

अन्य में शामिल हैं: विध्वंसक से फेंक: आईएसओ / आईईसी 14882 /15.2 / 3


7
*( ( char* ) NULL ) = 0;

यह एक विभाजन दोष उत्पन्न करेगा।


10
यह क्रैश की गारंटी नहीं है।
विंडोज प्रोग्रामर

23
"इसके बजाय क्या होगा?" - इसके बदले कुछ भी हो सकता है। व्यवहार अपरिभाषित है, इसलिए कार्यान्वयन आपके प्रोग्राम के किसी एक चर में 0 असाइन कर सकता है, या यह आपके प्रोग्राम के किसी एक चर में 42 असाइन कर सकता है, या यह आपके हार्ड ड्राइव को प्रारूपित कर सकता है और आपके प्रोग्राम को निष्पादित कर सकता है।
विंडोज प्रोग्रामर

7
(जारी "विंडोज प्रोग्रामर" मन का सेट) यह आपको कंप्यूटर विस्फोट कर सकता है, या इसके कारण एक लाइव आ सकता है और मानवता को संभाल सकता है। या ... यह 99.9% में दुर्घटनाग्रस्त हो जाएगा और इसे "अपरिभाषित व्यवहार" के रूप में परिभाषित किया गया है क्योंकि कोई भी इस पर जिम्मेदारी नहीं लेना चाहता है।
Roee Gavirel

1
वास्तव में, यह भी अपरिभाषित व्यवहार करने की गारंटी नहीं है - यह पूरी तरह से परिभाषित और ठीक से काम कर सकता है। : इस कोड पर विचार करें pastebin.com/WXCtTiDD (रूट के रूप में लिनक्स पर परीक्षण किया गया, तो आप इस गैर-रूट उपयोगकर्ता के रूप में भी कर सकता है अगर आप कुछ config परिवर्तन करना wiki.debian.org/mmap_min_addr )
cha0site

2
@ cha0site: यह मानक द्वारा अपरिभाषित व्यवहार की गारंटी है, क्योंकि यह एक अशक्त सूचक है। "अपरिभाषित व्यवहार" की छतरी के नीचे लिनक्स पर आपके द्वारा देखा गया कोई भी व्यवहार स्वीकार्य है
बेन वायगेट

6

यह एक गायब है:

int main = 42;

1
हाँ यह करता है; लेकिन यह कुछ शानदार करता है जब आप इसे चलाते हैं।
जोशुआ

5

एक मृत लूप पुनरावर्ती विधि कॉल द्वारा स्टैक ओवरफ्लो के बारे में क्या?

#include <windows.h>
#include <stdio.h>

void main()
{
    StackOverflow(0);
}

void StackOverflow(int depth)
{
    char blockdata[10000];
    printf("Overflow: %d\n", depth);
    StackOverflow(depth+1);
}

Microsoft KB पर मूल उदाहरण देखें


4
अनुपयोगी स्मार्ट कंपाइलर को अप्रयुक्त स्टैक आवंटन और पूंछ कॉल दोनों को दूर करने से क्या रोक सकेगा?
जेबी

@ जेबी: दुर्भाग्य से कोई विचार नहीं है क्योंकि मौजूदा संकलक अनुकूलन तर्क के साथ पारिवारिक नहीं है
sll

8
अच्छी तरह से, अनुकूलन स्तर -2 और उससे अधिक पर gcc 4.6.0 के साथ संकलित किया गया है, यह ठीक-ठीक अनुकूलन करता है। यह जरूरत है -O1 या segfault को कम।
जेबी

@Abhinav: बस इन तरीकों सी ++ :) में एक उदाहरण के रूप में व्यक्त के साथ अपने उत्तर पोस्ट
SLL

5

यह मेरे लिनक्स सिस्टम पर क्रैश होता है, क्योंकि स्ट्रिंग मैमोरी केवल मेमोरी में पढ़ी जाती है:

0[""]--;

वैसे, जी ++ इसे संकलित करने से इनकार करता है। संकलक चालाक और चालाक हो रहे हैं :)


4
int i = 1 / 0;

आपका कंपाइलर शायद आपको इस बारे में चेतावनी देगा, लेकिन यह जीसीसी 4.4.3 के तहत ठीक ठीक संकलित करता है। यह संभवतः एक SIGFPE (फ़्लोटिंग-पॉइंट अपवाद) का कारण होगा , जो संभवतः एक वास्तविक एप्लिकेशन में SIGSEGV (मेमोरी उल्लंघन उल्लंघन) के रूप में संभव नहीं है। अन्य उत्तर कारण हैं, लेकिन यह अभी भी एक दुर्घटना है। मेरी राय में, यह बहुत अधिक पठनीय है।

एक और तरीका है, अगर हम धोखा देने और उपयोग करने जा रहे हैं signal.h, यह है:

#include <signal.h>
int main() {
    raise(SIGKILL);
}

यह उपप्रकार को मारने की गारंटी है, SIGSEGV के साथ इसके विपरीत।


2
यह क्रैश की गारंटी नहीं है।
विंडोज प्रोग्रामर

11
C ++ भाषा यह गारंटी नहीं देती है कि 1/0 SIGFPE का कारण होगा। व्यवहार अपरिभाषित है। कार्यान्वयन यह कह सकता है कि परिणाम 42 है।
विंडोज प्रोग्रामर

1
जब व्यवहार अपरिभाषित होता है, तो कार्यान्वयन जो चाहे कर सकता है। सी ++ भाषा न तो क्रैश डंप लिखने के लिए न तो कार्यान्वयन की आवश्यकता है, न ही सी ++ भाषा न तो रोकती है और न ही 42 को असाइन करने के लिए कार्यान्वयन की आवश्यकता है, आदि
विंडोज प्रोग्रामर

2
@Giorgio अगर हार्डवेयर में फंसने का कोई तरीका नहीं है तो यह स्वचालित रूप से आपको कंपाइलर को कम से कम दो निर्देशों का उत्सर्जन करने के लिए मजबूर करता है, जिनमें से एक शाखा भी होगी। यह एक विभाजन की लागत का लगभग दोगुना है। हर कोई उस तरह की लागत का भुगतान करता है। यदि यह वैकल्पिक है और आप चाहते हैं कि आप हमेशा इसके लिए लाइब्रेरी फ़ंक्शन का उपयोग कर सकें। यदि यह वैकल्पिक नहीं है और आप नहीं चाहते हैं कि आप अभी भी लागत का भुगतान करेंगे।
फ्लेक्सो

2
@ जिओर्जियो: मेरे पास एक एप्लीकेशन है जो 100,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 करोड़ एक लाख पहुँचा चुका है। मैं एक तथ्य के लिए जानता हूं कि इनमें से 0 शून्य से एक विभाजन होगा हालांकि ऐसा कोई तरीका नहीं है जिससे कंपाइलर यह जान सके। मैं निश्चित रूप से नहीं चाहता कि कंपाइलर किसी डिवीजन के लिए चेक को शून्य से लगाए।
मार्टिन यॉर्क

4

यह उपरोक्त उत्तरों में प्रस्तुत किए गए गर्भपात का एक अधिक गारंटीकृत संस्करण है। यह उस स्थिति का ध्यान रखता है जब सिगबरेट अवरुद्ध हो जाता है। आप गर्भपात के बजाय किसी भी संकेत का उपयोग कर सकते हैं जो प्रोग्राम को क्रैश करने की डिफ़ॉल्ट कार्रवाई है।

#include<stdio.h>
#include<signal.h>
#include<unistd.h> 
#include<stdlib.h>
int main()
{
    sigset_t act;
    sigemptyset(&act);
    sigfillset(&act);
    sigprocmask(SIG_UNBLOCK,&act,NULL);
    abort();
}

3
int* p=0;
*p=0;

यह भी दुर्घटनाग्रस्त होना चाहिए। विंडोज पर यह AccessViolation के साथ दुर्घटनाग्रस्त हो जाता है और इसे सभी OS-es पर मुझे ऐसा ही करना चाहिए।


5
on all OS-esनहीं, यह गैर-संरक्षित ओएस (जैसे एमएस-डॉस) में दुर्घटना नहीं करता है। वास्तव में, कभी-कभी पता 0 में कुछ होता है ! X86 वास्तविक मोड के लिए, इंटरप्ट वेक्टर टेबल पता 0.
ikh

यह Irix पर दुर्घटनाग्रस्त नहीं हुआ। मैं उदासी महसूस किया है जब हम लिनक्स (करने के लिए कि कोड भेजा जहाँ हम भी नहीं पहुंचे main()
Scheff

3

यह Google द्वारा ब्रेकपैड में प्रदान किया गया स्निपेट है।

  volatile int* a = reinterpret_cast<volatile int*>(NULL);
  *a = 1;

1
जब से मैं ब्रेकपैड का परीक्षण कर रहा हूं, यह वही है जो मैं चाहता था! मैंने पाया कि कुछ ब्रेकपैड मिनीपंप एक स्टैक ट्रेस का उत्पादन नहीं करते हैं जो मेरे कोड में लाइन को इंगित करता है जिससे दुर्घटना होती है। यह एक करता है, इसलिए मैं इसे अच्छे poc परीक्षण के रूप में उपयोग कर सकता हूं।
BuvinJ


2

हालांकि इस सवाल का पहले से ही एक स्वीकृत उत्तर है ...

void main(){
    throw 1;
}

या ... void main(){throw 1;}


2

जब तक आपका सिस्टम रीड-ओनली मेमोरी ब्लॉक्स को सपोर्ट नहीं करता है, तब तक रीड-ओनली मेमोरी लिखने से सेगमेंटेशन में खराबी होगी।

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

मैंने इसे विंडोज 7 पर मिंगगॉव 5.3.0 और लिनक्स मिंट पर जीसीसी के साथ परीक्षण किया है। मुझे लगता है कि अन्य कंपाइलर और सिस्टम एक समान प्रभाव देंगे।


1

या दूसरे तरीके से हम बैंड वैगन पर हैं।

अनंत पुनरावृत्ति का एक प्यारा टुकड़ा। अपने ढेर को उड़ाने की गारंटी।

int main(int argv, char* argc)
{
   return main(argv, argc)
}

प्रिंट आउट:

विभाजन दोष (कोर नहीं चला)


13
mainअपने आप को कॉल करना वास्तव में अपरिभाषित व्यवहार है, अगर आपको पता नहीं था :) इसके अलावा, पूंछ की पुनरावृत्ति आपके स्टैक को उड़ाने की गारंटी नहीं है । यदि आप "गारंटी" चाहते हैं, तो आपको पुनरावर्ती कॉल के बाद कुछ करना होगा , अन्यथा कंपाइलर एक अनंत लूप में पुनरावृत्ति को अनुकूलित कर सकता है।
5

0

एक जिसका उल्लेख अभी तक नहीं किया गया है:

((void(*)())0)();

यह नल पॉइंटर को फंक्शन पॉइंटर के रूप में मानेगा और फिर कॉल करेगा। अधिकांश तरीकों की तरह, यह प्रोग्राम को क्रैश करने की गारंटी नहीं है, लेकिन ओएस के अनियंत्रित होने और कभी वापस आने वाले प्रोग्राम की अनुमति नगण्य है।


3
मैं कई मशीनों को जानता हूं कि यह फिर से बूट का कारण बनेगा क्योंकि ओएस स्टार्टअप कोड प्रभावी रूप से पते 0 पर मैप किया जाता है। यह मत मानो कि सब कुछ आपके पीसी की तरह काम करेगा। आप कह सकते हैं कि यह एक दुर्घटना थी लेकिन यह बहुत उपयोगी नहीं है क्योंकि आप इसे डिबग नहीं कर सकते हैं क्योंकि सभी राज्य स्टार्टअप पर मिटा दिए जाते हैं।
मार्टिन यॉर्क

@ लोकी एस्टरी: मैं कोई भी कम नहीं कहूंगा कि यह एक दुर्घटना है - यदि यह इसका कारण हो सकता है, तो प्रोग्राम को डिबग किया जा सकता है, जिसका अर्थ है कि यह किसी भी परीक्षा के रूप में अच्छा है। दूसरी ओर, मैं उत्सुक हूं कि इनमें से कौन सी मशीन पायथन को चला सकती है।
एंटोन गोलोव

मुझे लगता है आपने पॉइंट छोड़ दिया। मैंने ओएस कोड 0. पर देखा है। इसका मतलब यह नहीं है कि सामान्य अच्छे कोड के साथ सिस्टम नहीं हैं जो कि सिर्फ 0. पर ठीक काम करेंगे या 0 पर बाइट्स बस आसानी से वापसी के लिए ओपकोड हो सकते हैं।
मार्टिन यॉर्क

मुझे 0 पर OS कोड के बारे में पता है; यही कारण है कि मुझे संदेह है कि 0 पर बाइट्स वापसी के लिए opcode होगा। कार्यक्रम काफी स्पष्ट रूप से किसी भी अधिक निष्पादित नहीं कर रहा है, और सामान्य तरीके से बाहर नहीं निकला, यानी यह दुर्घटनाग्रस्त हो गया - अगर यह पूछने वाले के लिए पर्याप्त नहीं है, तो मैं उससे खुद इस पर टिप्पणी करने की उम्मीद करता हूं।
एंटोन गोलोव

2
आपको केवल अपने मशीन के लिए OS कोड की जानकारी है। मैं जो कहना चाह रहा हूं, वह आपके लिए विफल हो सकता है। लेकिन इसका मतलब कुछ भी नहीं है। वहाँ बहुत सारी प्रणालियाँ हैं। मुझे यकीन है कि उनमें से कुछ यह काम कर सकते हैं (जैसे कि दुर्घटना में नहीं)। मशीन / ओएस विशिष्ट व्यवहार पर भरोसा करना एक बुरा विचार है और लंबे समय में रखरखाव की समस्याओं का कारण बनता है। साइट का विचार अच्छे कोड को बढ़ावा देना है (न कि केवल उस तरह के कोड को काम करना)।
मार्टिन यॉर्क

0
void main()
{

  int *aNumber = (int*) malloc(sizeof(int));
  int j = 10;
  for(int i = 2; i <= j; ++i)
  {
      aNumber = (int*) realloc(aNumber, sizeof(int) * i);
      j += 10;
  }

}

उम्मीद है कि यह दुर्घटनाग्रस्त हो जाएगा। चीयर्स।


0
int main()
{
    int *p=3;
    int s;
    while(1) {
        s=*p;
        p++;
    }
}

2
कुछ स्पष्टीकरण करना बहुत अच्छा होगा :)
ओलिव

1
p पॉइंटर प्रोग्राम के एड्रेस स्पेस से परे जाएगा जो एक मेमोरी एरर होगा, क्योंकि एक प्रोसेस दूसरे प्रोसेस की मेमोरी को एक्सेस नहीं कर सकता है। इससे प्रोग्राम क्रैश हो जाएगा। पॉइंटर पी अपने एड्रेस स्पेस में एक यादृच्छिक स्थान की ओर इशारा कर रहा है, अगर यह बढ़ा हुआ है और कुछ बिंदु पर असीम रूप से डीरिफर किया गया है तो यह दूसरे प्रोग्राम के (प्रोसेस) एड्रेस स्पेस को इंगित करेगा। इसलिए यह कुछ समय बाद दुर्घटनाग्रस्त हो जाएगा।
sc_cs

या, काल्पनिक रूप से यह पूर्ण रूप से चल रहे पूर्णांक अतिप्रवाह और चारों ओर लपेट सकता है। मैं तेजी से दुर्घटनाग्रस्त होने के लिए संबंधित अधिकतम मूल्य पर उपयोग करने long longया size_tशुरू करने की कोशिश करता हूं pया इसके करीब हूं । हालांकि यह अभी भी उस मामले में दुर्घटना की गारंटी नहीं है।
पैट्रिक रॉबर्ट्स

0

ऐसा करने का एक स्टाइलिश तरीका एक शुद्ध आभासी फ़ंक्शन कॉल है:

class Base;

void func(Base*);

class Base
{
public:
   virtual void f() = 0;
   Base() 
   {
       func(this);
   }
};

class Derived : Base
{
   virtual void f()
   {
   }
};

void func(Base* p)
{
   p->f();
}


int main()
{
    Derived  d;
}

जीसीसी के साथ संकलित, यह प्रिंट:

शुद्ध आभासी विधि कहा जाता है

एक सक्रिय अपवाद के बिना बुलाया समाप्त

निरस्त (कोर डंप)


0

आप अपने सी ++ में असेंबली का उपयोग कर सकते हैं code BUT INT 3 केवल x86 सिस्टम के लिए है अन्य सिस्टम में अन्य जाल / ब्रेकपाइंट निर्देश हो सकते हैं।

int main()
{
    __asm int 3;

    return 0;
}

INT 3 एक अवरोध का कारण बनता है और ओएस द्वारा स्थापित एक बाधा वेक्टर कहता है।


0

GCC या दबंग में __builtin_trap () का उपयोग करें, या __debugbreak () MSVC में। इन ब्रेकपॉइंट्स / ट्रैप्स को हैंडल नहीं करने से एक अनहेल्डेड ब्रेकप्वाइंट अपवाद / क्रैश हो जाएगा। अन्य सुझाव जो गर्भपात () या निकास () का उपयोग करते हैं: जिन्हें अन्य थ्रेड्स द्वारा नियंत्रित किया जा सकता है, जिससे दुर्घटना को फैलाने वाले धागे के ढेर को देखना अधिक कठिन हो जाता है।


-2
char*freeThis;
free(freeThis);

एक असंक्रमित सूचक को मुक्त करना अपरिभाषित व्यवहार है। कई प्लेटफार्मों / कंपाइलरों पर, freeThisएक यादृच्छिक मूल्य (जो भी उस मेमोरी स्थान पर पहले था) होगा। इसे मुक्त करने से सिस्टम को उस पते पर मेमोरी को मुक्त करने के लिए कहा जाएगा, जो आमतौर पर एक विभाजन दोष का कारण होगा और कार्यक्रम को दुर्घटनाग्रस्त कर देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.