एक ढेर अतिप्रवाह का उत्पादन करने का अजीब तरीका [बंद]


146

एक प्रोग्रामर के रूप में आप निश्चित रूप से एक स्पष्ट पुनरावृत्ति के कारण स्टैक ओवरफ्लो की त्रुटि जानते हैं। लेकिन अपनी पसंदीदा भाषा को उस त्रुटि से बाहर निकालने के लिए निश्चित रूप से कई अजीब और असामान्य तरीके हैं।

उद्देश्य:

  1. स्टैक ओवरफ्लो का कारण होना चाहिए जो त्रुटि आउटपुट पर स्पष्ट रूप से दिखाई देता है।
  2. एक स्पष्ट पुनरावृत्ति का उपयोग करने की अनुमति नहीं है।

अमान्य कार्यक्रमों के उदाहरण:

// Invalid, direct obvious recursion.
methodA(){ methodA(); }
// Invalid, indirect, but obvious recursion.
methodA(){ methodB(); }
methodB(){ methodA(); }

सबसे रचनात्मक तरीके इस रूप में सबसे अच्छे हैं । Ie, इस तरह स्पष्ट जवाब उबाऊ से बचें:

throw new StackOverflowError(); // Valid, but very boring and downvote-deserving.

हालाँकि मैंने अभी एक उत्तर स्वीकार किया है, और अधिक उत्तर जोड़ना अभी भी ठीक है :)


14
मैं stackoverflow.com पर नेविगेट करके उत्पादन करता हूं, हालांकि मुझे अपनी पसंद के खोज इंजन पर 'स्टैक ओवरफ्लो' को क्वेरी करने के लिए जाना जाता है।
OJFord

21
Internet Explorer का उपयोग करें। एक निश्चित तरीके से एक को पकड़ने के लिए :)
asgoth

64
स्टैक ओवरफ़्लो का उत्पादन करने का सबसे अजीब तरीका codegolf.stackexchange.com पर एक लोकप्रियता-प्रतियोगिता पोस्ट करना है जो लोगों को स्टैक ओवरफ़्लो का उत्पादन करने के लिए सबसे अजीब तरीका पोस्ट करने के लिए कहता है। उत्तरदाता, प्रश्न के अपने समाधान का परीक्षण करने के लिए, स्टैक ओवरफ्लो का उत्पादन करेंगे। हालांकि मैंने इसका परीक्षण नहीं किया है, इसलिए मुझे यकीन नहीं है कि यह काम करता है (यही वजह है कि मैंने इसे उत्तर के रूप में पोस्ट नहीं किया है)।
टिम सेगिन

3
मैं इस विधि के लिए आंशिक हूं: joelonsoftware.com/items/2008/09/15.html
robert

11
ड्राइव एक टोयोटा (अरे, एक मिनट प्रतीक्षा करें, मेरी कार है एक टोयोटा ...)
उतरी ossifrage

जवाबों:


225

अजगर

import sys
sys.setrecursionlimit(1)

इससे दुभाषिया तुरंत विफल हो जाएगा:

$ cat test.py
import sys
sys.setrecursionlimit(1)
$ python test.py
Exception RuntimeError: 'maximum recursion depth exceeded' in <function _remove at 0x10e947b18> ignored
Exception RuntimeError: 'maximum recursion depth exceeded' in <function _remove at 0x10e8f6050> ignored
$ 

पुनरावृत्ति का उपयोग करने के बजाय, यह बस स्टैक को सिकोड़ता है ताकि यह तुरंत बह निकले।


12
प्यारा, लेकिन यह बिल्कुल नहीं कि मूल प्रश्न मेरे विचार से किस उद्देश्य से था।
नाइट

12
@ मैं समस्या नहीं देखता। इस समाधान के बारे में क्या असंतोषजनक है?
6

17
@ masterX244 हां, सवाल का पूरा बिंदु "इसे सामान्य तरीके से नहीं करना" है।
प्लूटोर

24
@Plutor क्या आप आमतौर पर उद्देश्य के लिए एक StackOverFlow स्थापित करते हैं?
कीवी


189

अजगर

import webbrowser
webbrowser.open("http://stackoverflow.com/")

7
बहुत खुबस। अच्छा और सुरुचिपूर्ण।
जेम्स वेबस्टर

103
बहुत शाब्दिक। बहुत जवाब।
टिम सेगिन

47
ठीक है, यह एक स्टैक ओवरफ्लो दिखाता है, लेकिन एक का उत्पादन करने के लिए , यह केवल काम करता है अगर यह जेफ एटवुड या जोएल स्पोल्स्की इसे निष्पादित कर रहा है।
मैकेनिकल घोंघा

10
@TimSeguine वाह।
सीन एलेड

9
उत्तर नहीं, क्योंकि यह त्रुटि आउटपुट में नहीं है।
पियरे अरलाउड

131

सी / लिनक्स 32 बिट

void g(void *p){
        void *a[1];
        a[2]=p-5;
}
void f(){
        void *a[1];
        g(a[2]);
}
main(){
        f();
        return 0;
}

रिटर्न एड्रेस को ओवरराइट करके काम करता है, इसलिए कॉल करने से पहले gपॉइंट पर वापस आ जाता है । ऐसे किसी भी प्लेटफ़ॉर्म के लिए काम करेंगे जहाँ रिटर्न एड्रेस स्टैक पर हों, लेकिन इसके लिए ट्वीक्स की आवश्यकता हो सकती है।mainf

बेशक, किसी सरणी के बाहर लिखना अपरिभाषित व्यवहार है , और आपको इस बात की कोई गारंटी नहीं है कि यह आपकी मूंछों को नीला करने के बजाय एक स्टैक अतिप्रवाह का कारण बनेगा। मंच, संकलक और संकलन झंडे का विवरण एक बड़ा अंतर ला सकता है।


1
यह एक segfault उत्पादन नहीं होगा?
11684

4
अजीब स्टैक हेरफेर के लिए +1 और बिल्कुल कोई पुनरावृत्ति नहीं!
RSFalcon7

6
@ 11684, यह अपरिभाषित व्यवहार है, इसलिए सामान्य तौर पर यह दुर्घटनाग्रस्त हो सकता है। 32 बिट लिनक्स (जिस पर मैंने परीक्षण किया) पर, यह सरणी के बाहर लिखता है, रिटर्न एड्रेस को ओवरराइट करता है, और स्टैक ओवरफ्लो होने तक क्रैश नहीं होता है।
ugoren

46
"अपनी मूंछें नीली पेंट करो" -> वह रेखा मेरे पास थी।
अनीश डोगरा

2
वाह। यह काल्पनिक रूप से बाधित है।
दर्पण

108

जावास्क्रिप्ट / डोम

with (document.body) {
    addEventListener('DOMSubtreeModified', function() {
        appendChild(firstChild);
    }, false);

    title = 'Kill me!';
}

यदि आप अपने ब्राउज़र को मारना चाहते हैं तो कंसोल में देखें।


53
मुझे यकीन है कि आप अधिक +1 वोट पाने के लायक हैं, लेकिन दुख की बात है कि लोगों ने मतदान करने से पहले यह कोशिश की .... lol
Reactgular

5
खैर, यह प्रभावी था। मैं इसे मारने के लिए अपने कार्य प्रबंधक को खोल भी नहीं पाया।
प्राइमो

1
क्रोम का उपयोग करें, टैब बंद करें। समस्या सुलझ गयी।
कोल जॉनसन

1
with (document.body) { addEventListener('DOMSubtreeModified', function() { appendChild(firstChild); }, false); title = 'Kill me!'; } 15:43:43.642 TypeError: can't convert undefined to object
ब्रायन मिंटन

1
लानत है मेरा फ़ायरफ़ॉक्स लटका दिया गया था
फरहाद

91

जावा

देखा कुछ इस तरह यहाँ के आसपास:

संपादित करें: जहां मैंने इसे देखा था: जोके का सबसे छोटा प्रोग्राम है, जो स्टैकऑवरफ्लो एरर को फेंकता है, का जवाब है

public class A {
    String val;
    public String toString() {
        return val + this;
    }

    public static void main(String[] args) {
        System.out.println(new A());
    }
}

कुछ जावा शुरुआती को भ्रमित कर सकता है। यह केवल पुनरावर्ती कॉल को छुपाता है। val + thisबन जाता है val + this.toString()क्योंकि valएक स्ट्रिंग है।

इसे यहां देखें: http://ideone.com/Z0sXiD


30
वास्तव में, यह करता है new StringBuilder().append(val).append("").append(this).toString(), और अंतिम एपेंड String.valueOf (...) को कॉल करता है, जो बदले में कॉल करता है। यह आपके स्टैक को थोड़ा विविध बनाता है (वहां तीन तरीके)।
पाओलो एबरमन

2
@ Pa @loEbermann हाँ, यह सही है। हालांकि, यह कहना बहुत आसान है कि यह बन जाता है "" + this.toString()
जस्टिन

2
मुझे लगता है कि + "" +लोगों को यह कहना मुश्किल हो सकता है क्योंकि यह पहली नज़र में बेकार लगता है। String val;और return val + this;मामूली रूप से डरपोक हो सकता है
क्रंचर

@ क्रंचर बिल्कुल नहीं। यदि आप एक जावा कोडर हैं, तो आपको पता होगा कि एक ""निर्माण के दौरान एक स्ट्रिंग के लिए एक intatenating का आसान तरीका -स्ट्रिंग के साथ है+ ""
जस्टिन

5
एक वास्तविक दुनिया के आवेदन में मैं अनंत पुनरावृत्ति और ढेर अतिप्रवाह त्रुटियों से बचना पसंद करूंगा
jon_darkstar

77

सी

काफी आसान:

int main()
{
    int large[10000000] = {0};
    return 0;
}

10
गैर स्पष्ट के लिए +1! इसके बावजूद यह बहुत प्रणाली पर निर्भर है ( ulimit -s unlimitedशेल में इसे हल करता है)
RSFalcon7

4
@ RSFalcon7, +1 के लिए धन्यवाद, लेकिन मेरे लिए यह वास्तव में सबसे स्पष्ट था !!
शाहबाज

14
@ क्रंचर: यह पुनरावृत्ति में परिणाम नहीं करता है। दी गई समस्या स्टैक को उड़ाने के लिए थी। कई ऑपरेटिंग सिस्टमों पर स्टैक निश्चित आकार का होता है, और दस मिलियन इनट्स से बहुत छोटा होता है, इसलिए यह स्टैक को उड़ा देता है।
एरिक लिपिपर्ट

2
@ हनोबिंदर, लिनक्स में जहां मैंने परीक्षण किया, आपको स्टैक ओवरफ्लो त्रुटि नहीं मिलती है। आपको एक सेगमेंटेशन दोष मिलता है, क्योंकि स्टैक परिणाम को अनजाने सेगमेंट तक पहुंच से बाहर कर देता है। मुझे यकीन नहीं है कि लिनक्स में स्टैक ओवरफ्लो त्रुटि भी मौजूद है, क्योंकि एक अनंत पुनरावर्ती फ़ंक्शन कॉल भी एक विभाजन दोष देता है।
शहबाज

3
~0uसी। में एक बहुत बड़ी संख्या है
वोर्टिको

63

सी में गैर-पुनरावर्ती स्टैक अतिप्रवाह

कन्वेंशन को मिसमैच कहते हैं।

typedef void __stdcall (* ptr) (int);

void __cdecl hello (int x) { }

void main () {
  ptr goodbye = (ptr)&hello;
  while (1) 
    goodbye(0);
}

के साथ संकलित करें gcc -O0

__cdeclफ़ंक्शंस से कॉलर को स्टैक को साफ़ करने की __stdcallउम्मीद है , और कैली को यह करने की उम्मीद है, इसलिए टाइपकास्ट फ़ंक्शन पॉइंटर के माध्यम से कॉल करके, क्लीनअप कभी नहीं किया जाता है - mainप्रत्येक कॉल के लिए स्टैक पर पैरामीटर को धक्का देता है लेकिन कुछ भी नहीं करता है और अंततः इसे पॉप करता है ढेर भर जाता है।


2
स्टैक को स्पैम करने का अच्छा तरीका: पी
मास्टरएक्स 244

62

जावास्क्रिप्ट

window.toString = String.toLocaleString;
+this;

5
यह एक अविकसित है।
Ry-

1
क्या करता +thisहै?
नोबल अपलिफ्ट

8
Unary + ToNumber अमूर्त ऑपरेशन को आमंत्रित करता है। यह संख्या के संकेत प्रकार के साथ ToPrimitive ऑपरेशन का उपयोग करता है। एक वस्तु पर ToPrimitive [[DefaultValue]] आंतरिक विधि का उपयोग करता है, जो जब एक संख्या संकेत पारित करता है, तो पहले यह देखने के लिए जाँचता है कि क्या valueOf () विधि मौजूद है और एक आदिम देता है। window.valueOf () एक वस्तु लौटाता है, इसलिए इसके बजाय [[DefaultValue]] कॉलिंग का परिणाम स्टर्लिंग () में देता है। पहली बात window.toString करता है (अब यह है कि यह toLocaleString है) 'इस' पर शुरू करने के लिए आह्वान करता है। दोहराएँ।
रयान कैवानुआग

3
यदि Chrome 'बहुत अधिक पुनरावृत्ति' में त्रुटि देता है, तो यह Chrome पर काम करता है, है ना? स्टैक ओवरफ्लो करता है, और यही कारण है कि क्रोम स्टैक ओवरफ्लो अपवाद को बचाता है।
डेविड कॉनरैड

4
आपको +{toString:"".toLocaleString}:-)
बरगी

62

मैं इस तथ्य से निराश था कि जावा 7 और जावा 8 मेरे पिछले उत्तर में मेरे बुरे कोड के लिए प्रतिरक्षा हैं । इसलिए मैंने फैसला किया कि इसके लिए एक पैच आवश्यक था।

सफलता! मैंने printStackTrace()फेंक दिया StackOverflowErrorprintStackTrace()आमतौर पर डिबगिंग और लॉगिंग के लिए उपयोग किया जाता है और किसी को भी संदेह नहीं है कि यह खतरनाक हो सकता है। यह देखना मुश्किल नहीं है कि कुछ गंभीर सुरक्षा मुद्दों को बनाने के लिए इस कोड का दुरुपयोग किया जा सकता है:

public class StillMoreEvilThanMyPreviousOne {
    public static void main(String[] args) {
        try {
            evilMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void evilMethod() throws Exception {
        throw new EvilException();
    }

    public static class EvilException extends Exception {
        @Override
        public Throwable getCause() {
            return new EvilException();
        }
    }
}

कुछ लोग सोच सकते हैं कि यह एक स्पष्ट पुनरावृत्ति है। यह नहीं। EvilExceptionनिर्माता कॉल नहीं करता getCause()विधि, ताकि अपवाद वास्तव में सभी के बाद सुरक्षित रूप से फेंक दिया जा सकता है। getCause()विधि को कॉल करने से परिणाम नहीं होगा StackOverflowError। पुनरावृत्ति JDK के सामान्य-असंगत printStackTrace()व्यवहार के अंदर है और डिबगिंग और लॉगिंग के लिए जो कुछ भी 3 पार्टी लाइब्रेरी है वह अपवाद का निरीक्षण करने के लिए उपयोग किया जाता है। इसके अलावा, यह संभावना है कि जिस स्थान पर अपवाद डाला गया है वह उस स्थान से बहुत दूर है जहां इसे संभाला जाता है।

वैसे भी, यहाँ एक कोड है जो एक फेंक देता है StackOverflowErrorऔर इसमें कोई पुनरावर्ती विधि कॉल नहीं है। StackOverflowErrorबाहर होता है mainविधि, JDK के दशक में UncaughtExceptionHandler:

public class StillMoreEvilThanMyPreviousOneVersion2 {
    public static void main(String[] args) {
        evilMethod();
    }

    private static void evilMethod() {
        throw new EvilException();
    }

    public static class EvilException extends RuntimeException {
        @Override
        public Throwable getCause() {
            return new EvilException();
        }
    }
}
Exception: java.lang.StackOverflowError thrown from the UncaughtExceptionHandler in thread "main"

2
: डी और अब एक क्रॉस जावा संस्करण स्टैकओवरफ़्लो अनुपालन विधि के साथ। दुष्ट कमीने! : D
कीवी

9
मैं इस मामले में स्पष्टता पर विचार करने के लिए इच्छुक हूं।
तैमूर

1
@BlacklightShining कॉलिंग getCause()विधि में परिणाम नहीं है StackOverflowError। यह इस तथ्य पर भरोसा कर रहा है कि एक जेडीके कोड है जो getCause()विधि को पुन: कॉल कर रहा है।
विक्टर स्टैफुसा

2
मुझे लगा कि आप getCauseइसे सिर्फ शरीर बदलकर सरल बना सकते हैं return this;लेकिन जाहिरा तौर पर जावा इसके लिए बहुत चालाक है। यह नोटिस करता है कि यह एक " CIRCULAR REFERENCE" है।
डेविड कॉनरैड

1
मुझे नहीं मिला StackOverflowErrorक्योंकि OpenBSD 5.5 पैकेज के jdk-1.7.0.21p2v0 में एक बग है। यह फेंक नहीं है StackOverflowError। यह SIGSEGVकोर को हिट और डंप करता है।
kernigh

57

लिनक्स x86 NASM असेंबली

section .data
    helloStr:     db 'Hello world!',10 ; Define our string
    helloStrLen:  equ $-helloStr       ; Define the length of our string

section .text
    global _start

    doExit:
        mov eax,1 ; Exit is syscall 1
        mov ebx,0 ; Exit status for success
        int 80h   ; Execute syscall

    printHello:
        mov eax,4           ; Write syscall is No. 4
        mov ebx,1           ; File descriptor 1, stdout
        mov ecx,helloStr    ; Our hello string
        mov edx,helloStrLen ; The length of our hello string
        int 80h             ; execute the syscall

    _start:
        call printHello ; Print "Hello World!" once
        call doExit     ; Exit afterwards

स्पॉइलर:

प्रिंटहेलो से वापस जाना भूल जाता है, इसलिए हम फिर से _start में कूदते हैं।


78
विधानसभा में, कुछ भी स्पष्ट नहीं है।
11684

21
@ 11684: मुझे लगता है कि विपरीत है: सच है, विधानसभा में, सब कुछ स्पष्ट है क्योंकि उनके कोड वास्तव में क्या कर रहे हैं यह छिपाने के लिए कोई भी अमूर्त का उपयोग नहीं कर सकता है।
मेसन व्हीलर

3
यह अपनी सादगी और भव्यता के लिए शानदार है।
१३:१३

11
@MasonWheeler: मैं कहना है कि सब कुछ है पसंद करते हैं दिखाई स्पष्ट करने के बजाय ... दिखाई और स्पष्ट के बीच अंतर को देखने के लिए एक अच्छा तरीका के लिए, मैं उल्लेख करने के लिए प्यार underhanded.xcott.com
ओलिवर Dulac

2
मुझे भूलने की अपनी लगातार गलतियों को याद हैret
रुस्लान

48

संकलन समय पर सी ++

template <unsigned N>
struct S : S<N-1> {};

template <>
struct S<0> {};

template
struct S<-1>;
$ g ++ -c test.cc -ftemplate-गहराई = 40000
g ++: आंतरिक संकलक त्रुटि: विभाजन दोष (प्रोग्राम cc1plus)
कृपया एक पूर्ण बग रिपोर्ट सबमिट करें,
यदि आवश्यक हो तो प्रीप्रोसेस स्रोत के साथ।
निर्देश के लिए देखें।

इस स्रोत फ़ाइल में कोई पुनरावृत्ति नहीं है, किसी एक वर्ग के पास स्वयं को आधार वर्ग के रूप में नहीं है, अप्रत्यक्ष रूप से भी नहीं। (C ++ में, इस तरह एक टेम्प्लेट क्लास में, S<1>और S<2>पूरी तरह से अलग क्लास हैं।) कंपाइलर में रिकर्सन के बाद स्टैक ओवरफ्लो स्टैक ओवरफ्लो के कारण होता है।


7
मैं स्वीकार करता हूं कि मैंने इसे आपके मेट्रापग्राम में एक स्पष्ट पुनरावृत्ति कहा होगा।
बहिष्कृत और बंद

2
जीसीसी पुनरावृत्ति का पता लगाता है और इनायत से इस तरफ रुक जाता है (4.8 और ऊपर से ठीक लगता है)
एलेक टीले

2
template <typename T> auto foo(T t) -> decltype(foo(t)); decltype(foo(0)) x;थोड़ा छोटा है।
केसी

2
@hvd जीसीसी में बग का शोषण होता दिख रहा है। क्लैंग गलत उपयोग को पकड़ता है - जो मुझे लगता है कि आप पहले से ही अवगत हैं - लेकिन यह मेरे जीसीसी को लगभग 2 मेगाबाइट त्रुटि संदेश बनाता है।
केसी


45

बैश (खतरे का अलर्ट)

while true
do 
  mkdir x
  cd x
done

सख्ती से बोलना, जो सीधे ओवरफ्लो नहीं करेगा, लेकिन यह बताता है कि " स्थिर स्टैक-ओवर-फ्लो जनरेटिंग स्थिति " के रूप में क्या लेबल किया जा सकता है : जब आप इसे तब तक चलाते हैं जब तक आपकी डिस्क पूरी नहीं हो जाती है, और "rm -rf" के साथ गड़बड़ी को दूर करना चाहते हैं। x ”, कि एक हिट है।

यह सभी प्रणालियों पर नहीं होता है, हालांकि। कुछ दूसरों की तुलना में अधिक मजबूत हैं।

बड़ा खतरा:

कुछ सिस्टम इसे बहुत बुरी तरह से हैंडल करते हैं और आपके पास सफाई करने में बहुत मुश्किल समय हो सकता है (क्योंकि "आरएम-आरएएफ" स्वयं एक पुनरावृत्ति समस्या में चलेगा)। आपको सफाई के लिए एक समान स्क्रिप्ट लिखनी पड़ सकती है।

यकीन नहीं तो एक खरोंच VM में यह कोशिश करो।

पुनश्च: वही लागू होता है, निश्चित रूप से, यदि प्रोग्राम किया जाता है या बैच स्क्रिप्ट में किया जाता है।
PPS: यह आपसे एक टिप्पणी प्राप्त करने के लिए इंटररस्टिंग हो सकता है कि आपका विशेष सिस्टम कैसे व्यवहार करता है ...


जैसा कि मैंने लिखा था: कई प्रणालियों पर, rm -rf नीचे जाने की कोशिश करता है और एक से टकरा जाता है (शायद अब नहीं, इन दिनों, 64 बिट एड्रेस स्पेस के साथ - लेकिन एक छोटे स्टैक के साथ छोटी मशीनों पर, यह हो सकता है)। बेशक, वहाँ भी हो सकता है "आरएम" के आसपास के
कार्यान्वयन

2
लगता है मुझे कुछ इस तरह while cd x; do :; done; cd ..; while rmdir x; cd ..; done;का ख्याल रखना चाहिए।
ब्लैकलाइट शाइनिंग

आप बिलकुल सही हैं ("क्लीनअप के लिए इसी तरह की स्क्रिप्ट" के साथ मेरा मतलब है)। हालाँकि, एक बार आपकी डिस्क (या कोटा) भर जाने के बाद, आपको बाद में लॉग इन करने में भी मुश्किल समय आ सकता है, क्योंकि कुछ सिस्टम उस स्थिति से बुरी तरह से निपटते थे। आपको मूल के रूप में प्राप्त करना होगा और स्क्रिप्ट करना होगा (जो कि आज के उन पीसी पर आसान है, लेकिन प्राचीन समय में अक्सर कठिन होता था, जब कंप्यूटर जहां एक से अधिक उपयोगकर्ताओं द्वारा उपयोग किया जाता है)।
blabla999

मज़ाकिया, यह नीचे दिए गए स्मालटाक जादू की तुलना में अधिक वोट मिलता है (कभी नहीं सोचा था!)
blabla999

किसी ने विंडोज पर यह कोशिश की?
सर्ज बोर्स्च

43

जावा

जावा गूढ़ व्यक्ति से एक अच्छा । क्या छपता है?

public class Reluctant {
    private Reluctant internalInstance = new Reluctant();

    public Reluctant() throws Exception {
        throw new Exception("I'm not coming out");
    }

    public static void main(String[] args) {
        try {
            Reluctant b = new Reluctant();
            System.out.println("Surprise!");
        } catch (Exception ex) {
            System.out.println("I told you so");
        }
    }
}

यह वास्तव में एक StackOverflowError के साथ विफल हो जाता है।

कंस्ट्रक्टर में अपवाद सिर्फ एक लाल हेरिंग है। इस बारे में पुस्तक का क्या कहना है:

जब आप किसी कंस्ट्रक्टर को इनवाइट करते हैं, तो इंस्टेंस वेरिएबल इनिशियलाइज़र्स कंस्ट्रक्टर के बॉडी के सामने चलते हैं । इस मामले में, चर के लिए internalInstanceइनिशलाइज़र कंस्ट्रक्टर को पुनरावर्ती रूप से आमंत्रित करता है। यह निर्माता, बदले में, अपने स्वयं के internalInstanceक्षेत्र को फिर से अनिच्छुक कंस्ट्रक्टर को इनवाइट करके शुरू करता है , विज्ञापन infinitum। StackOverflowErrorकंस्ट्रक्टर बॉडी को कभी भी निष्पादित करने का मौका मिलने से पहले इन पुनरावर्ती आक्रमणों का कारण बनता है । क्योंकि इसके बजाय StackOverflowErrorउप-प्रकार Errorहै Exception, कैच क्लॉज़ mainइसे नहीं पकड़ता है।


41

LaTeX

\end\end

इनपुट स्टैक ओवरफ्लो करता है क्योंकि \endबार-बार खुद को अनंत लूप में फैलता है, जैसा कि यहां बताया गया है

TeX एक TeX capacity exceeded, sorry [input stack size=5000]या समान के साथ विफल रहता है ।


1
मैं एक TeX / LaTeX मुद्दे की प्रतीक्षा कर रहा था। उन चीजों को सबसे अधिक परेशान किया जाता है - आमतौर पर, मैं भूल गया हूं कि मैं प्रोग्रामिंग के रूप में क्या मायने रखता हूं जब अचानक मैंने कुछ ऐसा लिखने में कामयाब रहा है जो असीम रूप से पुनरावर्ती है।
इरनिर


1
"TeX क्षमता पार हो गई, क्षमा करें" TeX विफल होने पर बहुत विनम्र है।
एलेक्स ए।

40

बीएफ

अंततः स्टैक को ओवरफ्लो करेगा, बस निर्भर करता है कि इंटरप्रेटर कितनी देर तक स्टैक बनाता है ...

+[>+]

5
वह कोड मुझे जीवन के खेल की याद दिलाता है।
एडम एरॉल्ड

10
कड़े शब्दों में कहें तो ब्रेनफक में कोई स्टैक नहीं है।
15

6
@ फेजेजोको टेप, अगर आप चाहें।
तैतिल

32

संकलन समय पर सी #

Microsoft C # कंपाइलर को इसके स्टैक को उड़ाने के कई तरीके हैं; किसी भी समय आप "# संकलित करने के लिए अभिव्यक्ति बहुत जटिल है" सी # कंपाइलर से देखते हैं जो लगभग निश्चित रूप से है क्योंकि स्टैक उड़ गया है।

पार्सर पुनरावर्ती वंश है, इसलिए किसी भी पर्याप्त रूप से गहरी नेस्टेड भाषा संरचना ढेर को उड़ा देगी:

 class C { class C { class C { ....

अभिव्यक्ति पार्सर आमतौर पर उस पर पुनरावर्ती को खत्म करने के बारे में बहुत चालाक है। आम तौर पर:

x = 1 + 1 + 1 + 1 + .... + 1;

जो एक बहुत गहरे पार्स पेड़ का निर्माण करता है, ढेर को नहीं उड़ाएगा। लेकिन अगर आप दूसरी तरफ होने वाली पुनरावृत्ति के लिए मजबूर करते हैं:

x = 1 + (1 + (1 + (1 + ....+ (1 + 1))))))))))))))))))))))))))))))))))))))))))...;

तब स्टैक को उड़ाया जा सकता है।

इन के पास अकूत संपत्ति है कि कार्यक्रम बहुत बड़ा है। सिमेंटिक एनालाइज़र को छोटे प्रोग्राम के साथ अनबाउंड रिक्रिएशन में जाना भी संभव है क्योंकि यह टाइप सिस्टम में कुछ अजीब चक्रों को हटाने के लिए पर्याप्त स्मार्ट नहीं है। (रोजलिन इसमें सुधार कर सकता है।)

public interface IN<in U> {}
public interface IC<X> : IN<IN<IC<IC<X>>>> {}
...
IC<double> bar = whatever;
IN<IC<string>> foo = bar;  // Is this assignment legal? 

मैं वर्णन करता हूं कि यह विश्लेषण यहां एक अनंत पुनरावृत्ति में क्यों जाता है:

http://blogs.msdn.com/b/ericlippert/archive/2008/05/07/covariance-and-contravariance-part-twelve-to-infinity-but-not-beyond.aspx

और कई और दिलचस्प उदाहरणों के लिए आपको इस पेपर को पढ़ना चाहिए:

http://research.microsoft.com/en-us/um/people/akenn/generics/FOOL2007.pdf


2
सटीक त्रुटि संदेश है fatal error CS1647: An expression is too long or complex to compile near (code)। इस त्रुटि संदेश के लिए प्रलेखन यहाँ है , और यह ठीक वैसा ही है जैसा कि आप कहते हैं: "संकलक में एक ढेर अतिप्रवाह था जो आपके कोड को संसाधित कर रहा था।"
bwDraco

32

इंटरनेट पर (अरब लोगों / दिन द्वारा उपयोग किया जाता है)

Redirects, HTTP status code: 301

उदाहरण के लिए, डेल समर्थन वेबसाइट पर (कोई अपराध नहीं, खेद डेल):

यदि आप URL से समर्थन TAG को हटाते हैं तो यह अनंत रीडायरेक्ट में चला जाता है । निम्नलिखित URL में, ###### कोई समर्थन TAG है।

http://www.dell.com/support/drivers/uk/en/ukdhs1/ServiceTag/######?s=BSD&~ck=mn

मेरा मानना ​​है कि यह स्टैक ओवरफ्लो के बराबर है।


5
अच्छा तरीका :) फ़ायरफ़ॉक्स बताता है कि यह पुनर्निर्देशित करता है इसलिए अनुरोध को हल नहीं किया जा सकता है जो स्टैकओवरफ़्लो rquivalent है :)
मास्टरएक्स 244

3
ध्यान दें कि पुनर्निर्देश अनंत नहीं हैं - यदि आप "फिर से कोशिश करें" हिट करते हैं /Errors/तो यह URL में कुछ और जोड़ देता है और फिर HTTP 400 बैड रिक्वेस्ट प्राप्त करने के बाद बंद हो जाता है। लेकिन यह यकीनन एक बेहतर रीडायरेक्ट की तुलना में बेहतर स्टैक ओवरफ्लो के लिए बनाता है।
नंदहप

@nandhp, मैं सहमत हूं, लेकिन अगर आपको लगता है कि तीसरी दुनिया के ब्राउज़र (आधुनिक नहीं, IE आदि ..), तो उन्हें इस स्थिति का सुराग नहीं मिला है।
कोडसेटर

2
यहाँ बताया गया है कि Wget कैसे प्रतिक्रिया देता है: pastebin.com/pPRktM1m
bwDraco

1
http://www.dell.com/support/drivers/uk/en/ukdhs1/ServiceTag/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/Errors/...
वोर्टिको

31

पीएचपी

स्टैकओवरफ़्लो केवल लूपिंग तत्वों के साथ किया जाता है।

$a = array(&$a);
while (1) {
    foreach ($a as &$tmp) {
        $tmp = array($tmp, &$a);
    }
}

स्पष्टीकरण (बिगाड़ने को देखने के लिए हॉवर):

जब दुभाषिया कचरा इकट्ठा करने की कोशिश करेगा, तो $tmpसरणी को दूर ले जाएगा (जब $tmpयहां पुन: असाइन किया गया है)। सिर्फ इसलिए कि ऐरे बहुत गहरा है (सेल्फ रेफ़रेंसिंग) और फिर कचरा इकट्ठा करने वाला एक पुनरावृत्ति में समाप्त होता है।


16
PHP की GC सेल्फ रेफ़रेंशियल स्ट्रक्चर का पता नहीं लगा सकती है? वास्तव में?! आउच। यही कारण है कि है बुराई।
पीटर सी

1
हां, लेकिन यह सही नहीं है। वहाँ कुछ कारण है while (1) { $a = array(&$a); }या कुछ इसी तरह की स्मृति सीमा हिट है ...
bwoebi

हाँ, मुझे लगता है कि यही कारण है कि PHP ऑब्जेक्ट ओरिएंटेड विकास के बारे में ठीक से काम नहीं कर रहा है; (अमूर्त, वंशानुक्रम आदि)
pythonian29033

1
@ pythonian29033 देखभाल के लिए विस्तृत?
ववन्द्रा

30

जावा

मैंने ठीक इसके विपरीत किया - एक ऐसा कार्यक्रम जो स्पष्ट रूप से स्टैक ओवरफ्लो त्रुटि को फेंकना चाहिए, लेकिन नहीं।

public class Evil {
    public static void main(String[] args) {
        recurse();
    }

    private static void recurse() {
        try {
            recurse();
        } finally {
            recurse();
        }
    }
}

संकेत: कार्यक्रम ओ (2 एन ) समय में चलता है , और एन स्टैक का आकार (आमतौर पर 1024) है।

से जावा पहेलियों # 45:

मान लेते हैं कि हमारी मशीन प्रति सेकंड 10 10 कॉल निष्पादित कर सकती है और प्रति सेकंड 10 10 अपवाद उत्पन्न कर सकती है , जो वर्तमान मानकों से काफी उदार है। इन मान्यताओं के तहत, यह कार्यक्रम लगभग 1.7 × 10 291 वर्षों में समाप्त हो जाएगा । इसे परिप्रेक्ष्य में रखने के लिए, हमारे सूर्य का जीवनकाल 10 10 वर्षों का अनुमान है , इसलिए यह एक सुरक्षित शर्त है कि हम में से कोई भी इस कार्यक्रम को समाप्त करने के लिए आसपास नहीं होगा। हालांकि यह एक अनंत लूप नहीं है, यह हो सकता है।


3
स्पष्ट पुनरावृत्ति ... बहुत दिलचस्प नहीं।
कामी

5
@Kami क्या आपने इसे आज़माया है? क्या आपको वास्तव में एक StackOverflowError मिली थी? यह स्पष्ट लगता है, लेकिन यह नहीं है।
ntoskrnl

सिर्फ इसलिए कि एक अपवाद पकड़ा जाता है इसका मतलब यह नहीं है कि इसे कभी नहीं फेंका गया था। यह कार्यक्रम हे (एन)
कोड्सचोस

1
@CodesInChaos ठीक है, इसलिए मैंने इसे डबल-चेक किया, और सही संस्करण finallyइसके बजाय उपयोग करता है catch, और चलने का समय ओ (2 ^ n) है। उत्तर अपडेट किया गया।
ntoskrnl 16

@ntorkrnl अच्छा एक + 1'd; btw को
स्टैकओवरफ्लो का

30

सी#

पहली पोस्ट, तो कृपया मुझ पर आसान हो।

class Program
{
    static void Main()
    {
        new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Invoke(null, null);
    }
}

यह बस एक स्टैक ट्रेस बनाता है, शीर्ष फ़्रेम को पकड़ता है (जो हमारी आखिरी कॉल होगी Main()), विधि प्राप्त करता है, और इसे इनवॉइस करता है।


selfinvoke का अच्छा तरीका जो स्पष्ट किए बिना स्पष्ट नहीं है; + 1'd
मास्टरएक्स 244

आपको उस कोड को "क्या संभवतः गलत हो सकता है?" टिप्पणी करनी चाहिए: P
अंतरिक्ष यात्री

26

जावा

  • जावा 5 में, printStackTrace()एक अनंत लूप में प्रवेश करता है।
  • जावा 6 में, printStackTrace()फेंकता है StackOverflowError
  • जावा 7 और 8 में, यह तय हो गया था।

पागल बात यह है कि जावा 5 और 6 में, यह उपयोगकर्ता कोड से नहीं आता है, यह जेडीके के कोड में होता है। कोई भी उचित संदेह नहीं है जो printStackTrace()निष्पादित करने के लिए खतरनाक हो सकता है।

public class Bad {
    public static void main(String[] args) {
        try {
            evilMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void evilMethod() throws Exception {
        Exception a = new Exception();
        Exception b = new Exception(a);
        a.initCause(b);
        throw a;
    }
}

7
हाँ; कुछ भी नहीं से बाहर stackoverflows कोडिंग के लिए सबसे अच्छे दोस्त हैं और उन्हें शिकार करने पर एक गंभीर सिरदर्द है
MasterX244

2
अगर किसी को आश्चर्य होता है, तो C # में समान कोड एक अनंत लूप का कारण बनता है। लेकिन InnerExceptionसंपत्ति केवल-पढ़ने के लिए है और निर्माणकर्ता में सेट है, इसलिए इसे पैदा करने के लिए प्रतिबिंब आवश्यक है।
अत्रि

17

जावास्क्रिप्ट: गैर-पुनरावर्ती, पुनरावृत्त समारोह म्यूटेशन

var f = function() {
    console.log(arguments.length);
};

while (true) {
    f = f.bind(null, 1);
    f();
}

यहाँ कोई पुनरावृत्ति नहीं है। fजब तक यह एक ही फ़ंक्शन कॉल में स्टैक को ओवरफ्लो नहीं कर सकता, तब तक अधिक से अधिक तर्कों के साथ बार-बार करी जाएगी console.logभाग वैकल्पिक मामले में आप को देखने के लिए कितने तर्क यह यह करने के लिए ले जाता है चाहता हूँ। यह भी सुनिश्चित करता है कि चतुर जेएस इंजन इसे दूर नहीं करेंगे।

CoffeeScript में कोड-गोल्फ संस्करण, 28 वर्ण:

f=->
do f=f.bind f,1 while 1

14

एक महाकाव्य असफलता के साथ सी #

using System.Xml.Serialization;

[XmlRoot]
public class P
{
    public P X { get { return new P(); } set { } }
    static void Main()
    {
        new XmlSerializer(typeof(P)).Serialize(System.Console.Out, new P());
    }
}

जिस तरह से यह विफल है वह महाकाव्य है, इसने मेरे दिमाग को पूरी तरह से उड़ा दिया:

यहां छवि विवरण दर्ज करें

यह अजीब छवियों की एक प्रतीत होता है अनंत ट्रिपिंग श्रृंखला का सिर्फ एक फ्रेम है।

यह अब तक की सबसे अजीब चीज हो गई है। क्या कोई समझा सकता है? जाहिरा तौर पर, इंडेंटेशन के लिए उपयोग किए जाने वाले रिक्त स्थान की बढ़ती मात्रा के कारण उन सफेद ब्लॉक दिखाई देते हैं। यह .NET 4.5 के साथ Win7 एंटरप्राइज़ x64 पर होता है।

मैंने वास्तव में अभी तक इसका अंत नहीं देखा है। यदि आप के System.Console.Outसाथ प्रतिस्थापित System.IO.Stream.Null, यह बहुत तेजी से मर जाता है।

स्पष्टीकरण बहुत आसान है। मैं एक वर्ग बनाता हूं, जिसके पास एक एकल संपत्ति है, और यह हमेशा अपने प्रकार के एक नए उदाहरण देता है। तो यह एक असीम रूप से गहरी वस्तु पदानुक्रम है। अब हमें कुछ ऐसा चाहिए जो उस माध्यम से पढ़ने की कोशिश करे। यह वह जगह है जहां मैं उपयोग करता हूं XmlSerializer, जो बस ऐसा करता है। और जाहिर है, यह पुनरावृत्ति का उपयोग करता है।


हाँ; क्रमबद्ध ftw: पी; लेकिन यह और अधिक मज़ेदार है जब ythe quirk आपके कोड के पूरी तरह से बाहर है जैसे कि स्नेकाइमल को कैसे विशेषताएँ मिलती हैं और एक वर्ग खुद को एक तरह से वापस कर देता है, जो कि अंतिम रूप से पुनरावृत्ति करता है
MasterX244

1
ठीक है, अतिप्रवाह मेरे कोड के बाहर होता है, लेकिन मैंने जो वास्तविक कारण पोस्ट किया है वह कंसोल में अप्रत्याशित दुष्प्रभाव के कारण है :-)
fejesjoco

मुझे लगता है कि सफेद बिट्स को .Net 4.5 के साथ या आपके पर्यावरण को कैसे सेट किया जाना चाहिए, क्योंकि .Net 4 का उपयोग करना (यहां तक ​​कि जब cmd के माध्यम से चलाया जाता है) तो मुझे केवल रिक्त स्थान मिलते हैं, कोई सफेद ब्लॉक नहीं। मेरा अनुमान है कि या तो cmd का Win7 एंटरप्राइज संस्करण या .Net 4.5 कंसोल एमुलेटर एक निश्चित चरित्र संयोजन को 'कंसोल कलर बैकग्राउंड बदल दें' के रूप में मानते हैं।
छपरा

मैं इसे Win7 x 64 प्रोफेशनल पर .NET 4.5 के साथ पुन: पेश नहीं कर सकता हूं, जिसमें एयरो चालू है
रे

या तो पुन: पेश नहीं कर सकते। .NET 4.5, विंडोज 8.1 प्रो।
bwDraco

13

दे घुमा के

_(){ _;};_

जबकि कई यह पहचान सकते हैं कि पुनरावृत्ति स्पष्ट है , लेकिन यह सुंदर लगता है। नहीं?

निष्पादन पर, आपको यह देखने की गारंटी है:

Segmentation fault (core dumped)

5
यह _(){_|_;};_
पूर्ववर्ती

1
@ RSFalcon7 Forkbomb अलर्ट! (इसके अलावा, इसे {सिंटैक्टली सही होने के बाद स्पेस की ज़रूरत नहीं है ?)
ब्लैकलाइट शाइनिंग

3
इसे भी आजमाएं:(){:|:;}:
Tarek Eldeeb

14
एक खौफनाक, उत्परिवर्ती इमोटिकॉन जैसा दिखता है।
टिम सेगिन

8
बैश इमोटिकॉन्स: चेहरे का भक्षक, ढेर का हत्यारा।
नोबल अपलिफ्ट

12

हास्केल

(उदास लेकिन कम से कम तब तक सच है ghc-7.6, हालांकि इसके साथ O1या अधिक यह समस्या को दूर करेगा)

main = print $ sum [1 .. 100000000]

क्या इसे टेल कॉल ऑप्टिमाइज़ेशन अपने आप नहीं होना चाहिए (संक्षेप में)?
blabla999

2
@ blabla999: टेल-कॉल हास्केल में उतना प्रासंगिक नहीं है, यह ज्यादातर गुप्त बिल्डअप है, जो गुप्त आलस्य के कारण ऐसी समस्याएँ पैदा कर रहा है। इस मामले में, मुद्दा यह है कि के sumसंदर्भ में कार्यान्वित किया जाता है foldl, जो पूंछ कॉल का उपयोग करता है, लेकिन क्योंकि यह संचायक का सख्ती से मूल्यांकन नहीं करता है, केवल मूल सूची के रूप में बड़े के ढेर का उत्पादन करता है। स्विच करते समय समस्या गायब हो जाती है foldl' (+), जो कड़ाई से मूल्यांकन करता है और इस प्रकार इसकी पूंछ कॉल में एक WHN देता है। या, जैसा कि मैंने कहा, यदि आप जीएचसी के अनुकूलन पर स्विच करते हैं!
१३'१४ को

आह - दिलचस्प है, इसलिए यदि कोई भी थंक के लिए इंतजार नहीं करेगा (यानी प्रिंट को छोड़कर), कचरा कलेक्टर उन्हें इकट्ठा करेगा (सामने से पीछे)?
ब्लाबला 999

1
BTW, इसमें से कोई भी वास्तव में हास्केल मानक द्वारा निर्दिष्ट नहीं किया गया है: यह केवल आवश्यक है कि मूल्यांकन गैर-सख्त हो , अर्थात यदि परिणाम पूरी तरह से आवश्यक नहीं है, तो एक गैर- संकलित गणना हमेशा के लिए अवरुद्ध हो जाएगी । कब तक यह वास्तव में कार्यान्वयन तक है, मानक आलसी जीएचसी में यह तब तक ब्लॉक नहीं करता है जब तक आप परिणाम का अनुरोध नहीं करते हैं।
चालू करना बंद कर दिया

2
हैस्केल शांत है।
blabla999

12

छोटी बात

यह मक्खी पर एक नई विधि
  बनाता है , जो मक्खी पर एक नई विधि बनाता है , जो मक्खी पर एक नई विधि
    बनाता है, जो
      ...
    ...
  ..
और फिर इसे स्थानांतरित करता है।

एक अतिरिक्त छोटी सी मसाला स्टैक मेमोरी और हीप मेमोरी को एक ही समय में लंबा और लंबा विधि नाम, और रिसीवर के रूप में एक बड़ी संख्या बनाकर, जैसा कि हम छेद नीचे गिरते हैं, से आता है ... (लेकिन पुनरावृत्ति पहले हमें मारती है )।

पूर्णांक में संकलित करें:

downTheRabbitHole
    |name deeperName nextLevel|

    nextLevel := self * 2.
    name := thisContext selector.
    deeperName := (name , '_') asSymbol.
    Class withoutUpdatingChangesDo:[
        nextLevel class 
            compile:deeperName , (thisContext method source copyFrom:name size+1).
    ].
    Transcript show:self; showCR:' - and down the rabbit hole...'.
    "/ self halt. "/ enable for debugging
    nextLevel perform:deeperName.

फिर छलांग लगाकर, मूल्यांकन करके "2 downTheRabbitHole"...
... थोड़ी देर बाद, आप एक डीबगर में समाप्त हो जाएंगे, एक RecursionException दिखाते हुए।

फिर आपको सभी मेस को साफ करना होगा (स्मॉलइंटर और लार्जइंटर दोनों में अब बहुत सारे वंडरलैंड कोड हैं):

{SmallInteger . LargeInteger } do:[:eachInfectedClass |
    (eachInfectedClass methodDictionary keys 
        select:[:nm| nm startsWith:'downTheRabbitHole_'])
            do:[:each| eachInfectedClass removeSelector:each]

वरना ब्राउज़र के कुछ समय ऐलिस के वंडरलैंड को हटाकर।

यहाँ ट्रेस के सिर से कुछ है:

2 - and down the rabbit hole...
4 - and down the rabbit hole...
8 - and down the rabbit hole...
16 - and down the rabbit hole...
[...]
576460752303423488 - and down the rabbit hole...
1152921504606846976 - and down the rabbit hole...
2305843009213693952 - and down the rabbit hole...
[...]
1267650600228229401496703205376 - and down the rabbit hole...
2535301200456458802993406410752 - and down the rabbit hole...
5070602400912917605986812821504 - and down the rabbit hole...
[...]
162259276829213363391578010288128 - and down the rabbit hole...
324518553658426726783156020576256 - and down the rabbit hole...
[...]
and so on...

PS: "withoutUpdatingChangesFile:" को स्मॉलटॉक की लगातार परिवर्तन-लॉग फ़ाइल को क्लीनअप करने से बचने के लिए जोड़ा गया था।

PPS: चुनौती के लिए धन्यवाद: कुछ नया और नया करने के बारे में सोचना मजेदार था!

PPPS: मैं यह नोट करना पसंद करता हूं कि कुछ स्मॉलटॉक बोलियाँ / संस्करण ढेर के ढेर को ढेर से बहते हुए कॉपी करते हैं - इसलिए ये इसके बजाय बाहर की स्थिति में चल सकते हैं।


2
अपने शुद्ध रूप में उस काले जादू के लिए LOL +1
मास्टरएक्स 244

अगर मुझे कुछ समय मिलता है, तो मैं एक अनाम वर्ग की एक अनाम पद्धति का उपयोग करके "सुधार" कर सकता हूं, ताकि सबसे गहरे खरगोश छेद हो ...
blabla999

12

सी#

वास्तव में बड़ा struct, कोई पुनरावृत्ति नहीं, शुद्ध C #, असुरक्षित कोड नहीं।

public struct Wyern
{
    double a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
}
public struct Godzilla
{
    Wyern a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
}
public struct Cyclops
{
    Godzilla a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
}
public struct Titan
{
    Cyclops a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
}
class Program
{
    static void Main(string[] args)
    {
        // An unhandled exception of type 'System.StackOverflowException' occurred in ConsoleApplication1.exe
        var A=new Titan();
        // 26×26×26×26×8 = 3655808 bytes            
        Console.WriteLine("Size={0}", Marshal.SizeOf(A));
    }
}

एक किकर के रूप में यह डिबग विंडोज़ को बताते हुए क्रैश करता है {Cannot evaluate expression because the current thread is in a stack overflow state.}


और सामान्य संस्करण (सुझाव NPSF3000 के लिए धन्यवाद)

public struct Wyern<T>
    where T: struct
{
    T a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;        
}


class Program
{
    static void Main(string[] args)
    {
        // An unhandled exception of type 'System.StackOverflowException' occurred in ConsoleApplication1.exe
        var A=new Wyern<Wyern<Wyern<Wyern<int>>>>();
    }
}

अधिक सामान्य कोड
मेथिंक की

यह पुनरावृत्ति की तरह दिखेगा, लेकिन यह नेस्टेड प्रकार के तर्कों के साथ संभव है।
ja72

1
मेरे पोस्ट करने से पहले अपना C # स्ट्रक्चर उत्तर न देखें। मेरे पास अभी भी थोड़ा अलग दृष्टिकोण है, इसलिए शायद हम उन्हें सह-अस्तित्व में आने दें।
थॉमस वेलर

11

सी#

ओवरराइड ==ऑपरेटर का दोषपूर्ण कार्यान्वयन :

public class MyClass
{
    public int A { get; set; }

    public static bool operator ==(MyClass obj1, MyClass obj2)
    {
        if (obj1 == null)
        {
            return obj2 == null;
        }
        else
        {
            return obj1.Equals(obj2);
        }
    }

    public static bool operator !=(MyClass obj1, MyClass obj2)
    {
        return !(obj1 == obj2);
    }

    public override bool Equals(object obj)
    {
        MyClass other = obj as MyClass;
        if (other == null)
        {
            return false;
        }
        else
        {
            return A == other.A;
        }
    }
}

कोई कह सकता है कि यह स्पष्ट है कि ऑपरेटर operator==का उपयोग करके खुद को कॉल करता है ==, लेकिन आप आमतौर पर इस तरह से नहीं सोचते हैं ==, इसलिए उस जाल में गिरना आसान है।


11

SnakeYAML का उपयोग करके उत्तर शुरू करना

class A
{

    public static void main(String[] a)
    {
         new org.yaml.snakeyaml.Yaml().dump(new java.awt.Point());
    }
}

संपादित करें: इसे ungolfed किया

पाठक तक इसका पता लगाने के लिए कि यह कैसे काम करता है: P (टिप: stackoverflow.com)

वैसे: रिक्रिएशन गतिशील रूप से स्नेकैमल द्वारा किया जाता है (आप नोटिस करेंगे कि क्या आप जानते हैं कि यह उन क्षेत्रों का पता कैसे लगाता है जो इसे क्रमबद्ध करते हैं और फिर देखते हैं Point 's sourcecode' )

संपादित करें: यह बताना कि कैसे काम करता है:

SnakeYAML के लिए एक ही नाम के साथ mthod की जोड़ी की तलाश है getXXXऔर गेट्टर के वापसी प्रकार सेटर के पैरामीटर के समान है; और आश्चर्यजनक रूप से कक्षा में एक है और जो खुद लौटता है; SnakeYAML इसे नोटिस नहीं करता है और उस quirk और StackOverflows पर पुनरावृत्ति करता है। पता चला कि एक जब उनके साथ काम कर रहा था और उस पर stackoverflow.com पर पूछ रहा था।setXXXXXXPointPoint getLocation()void setLocation(Point P)HashMap


10

सी#

गलत तरीके से लागू संपत्ति पाने वाला

class C
{
   public int P { get { return P; } }
}

static void Main()
{
   int p = new C().P;
}

14
IMHO। यह एक स्पष्ट पुनरावृत्ति के लिए एक उत्कृष्ट उदाहरण है ... (और इसलिए मान्य नहीं)
ओले अल्बर्स

2
ठीक है, यह केवल एक बार ही आप इसे एक बार कर चुके हैं और यह पता लगा लिया है कि C # गेटर्स उस तरह से काम नहीं करते हैं जैसा आपने सोचा होगा कि उन्होंने किया था। आखिरकार, यह कोड एक सदस्य चर घोषणा है, इसलिए इसे वास्तविक सदस्य चर क्यों नहीं बनाना चाहिए?
meustrus

2
यह करने के एक जटिल तरीके से अधिक नहीं हैstatic void Main() { Main(); }
जोडरेल

5
@Jodrell आप Main()आकस्मिक रूप से पुनरावर्ती नहीं लिखेंगे । लेकिन एक पुनरावर्ती संपत्ति को गलती से लिखना और फिर स्टैक ओवरफ्लो से भ्रमित होना काफी सरल है।
svick

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