স্ট্যাক ওভারফ্লো উত্পাদন করার সবচেয়ে অদ্ভুত উপায় [বন্ধ]


146

একজন প্রোগ্রামার হিসাবে আপনি অবশ্যই একটি স্পষ্ট পুনরাবৃত্তি কারণে স্ট্যাক ওভারফ্লো ত্রুটি জানেন। তবে আপনার প্রিয় ভাষাটি ত্রুটিটি ছড়িয়ে দেওয়ার জন্য অবশ্যই অনেকগুলি অদ্ভুত এবং অস্বাভাবিক উপায় রয়েছে।

উদ্দেশ্য:

  1. অবশ্যই স্ট্যাকের ওভারফ্লো হতে হবে যা ত্রুটি আউটপুটটিতে স্পষ্টভাবে দৃশ্যমান।
  2. সুস্পষ্ট পুনরাবৃত্তি ব্যবহার করার অনুমতি নেই।

অবৈধ প্রোগ্রামগুলির উদাহরণ:

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

সর্বাধিক সৃজনশীল উপায়গুলি এটি হিসাবে সেরা । যেমন, এর মতো সুস্পষ্ট উত্তরগুলি বিরক্ত করা এড়িয়ে চলুন:

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

যদিও আমি এখনই একটি উত্তর গ্রহণ করেছি, আরও উত্তর যুক্ত করা এখনও ঠিক আছে :)


14
আমি স্ট্যাকওভারফ্লো ডট কম এ নেভিগেট করে উত্পাদনের প্রবণতা অর্জন করি, যদিও আমার পছন্দের অনুসন্ধান ইঞ্জিনে 'স্ট্যাক ওভারফ্লো' কোয়েরি করার জন্য আমি পরিচিত।
ওজেফোর্ড

21
ইন্টারনেট এক্সপ্লোরার ব্যবহার করুন।
এটির

64
স্ট্যাক ওভারফ্লো উত্পাদন করার সবচেয়ে অদ্ভুততম উপায় হ'ল কোডগলফ.স্ট্যাকেক্সেক্সচেঞ্জ.কম এ জনপ্রিয়তা-প্রতিযোগিতা পোস্ট করা যাতে লোকেরা স্ট্যাকের ওভারফ্লো উত্পাদন করার সবচেয়ে অদ্ভুত উপায় পোস্ট করে to প্রতিক্রিয়াকারীরা, প্রশ্নের সমাধানগুলির পরীক্ষার জন্য, একটি স্ট্যাক ওভারফ্লো উত্পাদন করবে। যদিও আমি এটি পরীক্ষা করে দেখিনি, সুতরাং এটি নিশ্চিতভাবে কাজ করতে পারে তা নিশ্চিত হতে পারি না (যার কারণে আমি এটি উত্তর হিসাবে পোস্ট করি নি)।
টিম সেগুইন

3
আমি এই পদ্ধতির আংশিক: joelonsoftware.com/items/2008/09/15.html
রবার্ট

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
@ না আমি সমস্যাটি দেখতে পাচ্ছি না। এই সমাধান সম্পর্কে কি সন্তোষজনক?
সাইমনটি

17
@ মাস্টারএক্স ২৪৪ হ্যাঁ, প্রশ্নের পুরো বিষয়টি "এটি সাধারণ পদ্ধতিতে করবেন না"।
প্লুটার

24
@ প্লুটর আপনি সাধারণত স্ট্যাকওভারফ্লো সেটআপ করেন?
কিউই


189

পাইথন

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

7
ফ্যান্টাস্টিক। সুন্দর এবং মার্জিত।
জেমস ওয়েবস্টার

103
অনেক আক্ষরিক। খুব উত্তর।
টিম সেগুইন

47
ঠিক আছে, এটি একটি স্ট্যাক ওভারফ্লো দেখায় , তবে একটি উত্পাদন করতে, এটি কেবল কাজ করে যদি এটি জেফ আতউড বা জোল স্পলস্কি এটি সম্পাদন করে।
যান্ত্রিক শামুক 0

10
পছন্দ করুন
শন অলরেড

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
এটি কি সেগফাল্ট তৈরি করবে না?
11684

4
অদ্ভুত স্ট্যাক ম্যানিপুলেশনের জন্য +1 এবং একেবারে কোনও পুনরাবৃত্তি নয়!
আরএসফালকন 7

6
@ 11684, এটি নির্ধারিত আচরণ, সুতরাং সাধারণভাবে এটি ক্রাশ হতে পারে। 32 বিবিট লিনাক্সে (যেটিতে আমি এটি পরীক্ষা করেছি) এটি অ্যারের বাইরে লিখেছে, ফেরতের ঠিকানাটি ওভাররাইট করে এবং স্ট্যাকের ওভারফ্লো না হওয়া পর্যন্ত ক্রাশ হয় না।
ugoren

46
"আপনার গোঁফ নীল রঙ করুন" -> এই লাইনটি আমার ছিল।
আনিশ ডোগরা

2
কি দারুন. এটি চমত্কারভাবে অপ্রচলিত।
মিররফেটে

108

জাভাস্ক্রিপ্ট / ডিওএম

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

    title = 'Kill me!';
}

আপনি যদি নিজের ব্রাউজারটিকে হত্যা করতে চান তবে কনসোলে এটি ব্যবহার করে দেখুন।


53
আমি নিশ্চিত যে আপনারা আরও +1 ভোটের প্রাপ্য, তবে দুঃখের সাথে লোকেরা ভোট দেওয়ার আগে এটি চেষ্টা করেছিল .... হ্যাঁ
পুনঃনির্মাণ

5
ঠিক আছে, এটি কার্যকর ছিল। আমি আমার টাস্ক ম্যানেজারটিকে এটি খোলার জন্য খুলতে পারি না।
primo

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()এবং শেষ সংযোজন স্ট্রিং.ভ্যালুওফ (...) কল করে, যা ঘুরে ফিরে স্ট্রিংকে কল করে। এটি আপনার স্ট্যাক ট্রেসকে কিছুটা বিচিত্র করে তোলে (সেখানে তিনটি পদ্ধতি)।
পাওলো ইবারম্যান

2
@ পাওলোএবারম্যান হ্যাঁ, এটি সঠিক। তবে এটি হয়ে ওঠার বিষয়টি আরও সহজ "" + this.toString()
জাস্টিন

2
আমি মনে করি এটি + "" +সম্ভবত লোকদের ডগা, কারণ এটি প্রথম নজরে অকেজো বলে মনে হচ্ছে। String val;এবং return val + this;সামান্য স্নিগ্ধ হতে পারে
ক্র

পছন্দ করুন আপনি যদি জাভা কোডার হন তবে আপনি জানতেন যে স্ট্রিং ""নির্মাণের সময় একটি স্ট্রিংয়ের সাথে কোন ইন্ট্রিটকেট করার সহজ উপায়টি রয়েছে+ ""
জাস্টিন

5
একটি বাস্তব বিশ্বের অ্যাপ্লিকেশনটিতে আমি অসীম পুনরাবৃত্তি এবং স্ট্যাক ওভারফ্লো ত্রুটিগুলি এড়াতে পছন্দ করব
jon_darkstar

77

সি

বেশ সহজ:

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

10
স্পষ্টত অজানা জন্য +1! এটি অত্যন্ত সিস্টেম নির্ভর ulimit -s unlimited
হয়েও

4
@ আরএসফালকন 7, +1 এর জন্য ধন্যবাদ, তবে আমার কাছে এটি ছিল সবচেয়ে স্পষ্টতই !!
শাহবাজ

14
@ ক্রাঙ্কার: এটি পুনরাবৃত্তির ফলে আসে না। প্রদত্ত সমস্যাটি ছিল স্ট্যাকটি ফুঁকানো। অনেক অপারেটিং সিস্টেমে স্ট্যাকটি স্থির আকারের এবং দশ মিলিয়ন ইন্টের চেয়ে অনেক ছোট, সুতরাং এটি স্ট্যাকটি ফুটিয়ে তোলে।
এরিক লিপার্ট

2
@ হ্যানোবাইন্ডার, লিনাক্সে যেখানে আমি পরীক্ষা করেছি সেখানে আপনি স্ট্যাক ওভারফ্লো ত্রুটি পাবেন না। অনাবৃত অংশগুলিতে অ্যাক্সেসের স্ট্যাকের ফলাফল উপচে পড়া থেকে আপনি একটি সেগমেন্টেশন ত্রুটি পান। আমি নিশ্চিত নই যে স্ট্যাক ওভারফ্লো ত্রুটি এমনকি লিনাক্সে উপস্থিত রয়েছে, যেহেতু একটি অসীম পুনরাবৃত্তি ফাংশন কলটি একটি বিভাজন ত্রুটিও দেয়।
শাহবাজ

3
~0uসি একটি প্রশংসনীয় সংখ্যক হয়
Vortico

63

সি তে পুনরাবৃত্ত স্ট্যাক ওভারফ্লো flow

কনভেনশনকে মেলেনি ing

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
এই এক underappreciated হয়।
রাই-

1
কি করে +this?
NobleUplift

8
Unary + ToNumber বিমূর্ত ক্রিয়াকলাপ প্রার্থনা করে। এটি একটি ইঙ্গিত ধরণের সংখ্যার সাথে ToPrimitive অপারেশন ব্যবহার করে। কোনও অবজেক্টে টুপ্রিমিটিভ [[ডিফল্টভ্যালু]] অভ্যন্তরীণ পদ্ধতি ব্যবহার করে, যা একটি সংখ্যা ইঙ্গিত দিয়ে গেলে প্রথমে মান ওফ () পদ্ধতিটি উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখায় এবং কোনও আদিম ফেরত দেয়। উইন্ডো.ভেলুওফ () কোনও অবজেক্ট ফেরত দেয়, সুতরাং পরিবর্তে [[ডিফল্টভ্যালু]] স্ট্রিংকে কল করার ফলাফল প্রদান করে ()। উইন্ডো.টোস্ট্রিংয়ের প্রথম জিনিসটি (এখন এটি লোকালস্ট্রিংয়ের কাছে রয়েছে) 'এই' তে টু স্ট্রিংয়ের জন্য আহ্বান জানায়। পদ্ধতি পুনরাবৃত্তি করুন।
রায়ান কাভানফ

3
যদি ক্রোম কোনও ত্রুটি ফেলে দেয়, 'খুব বেশি পুনরাবৃত্তি', তবে এটি ক্রোমে কাজ করে, তাই না? স্ট্যাক ওভারফ্লো হয়ে যায় এবং ক্রোম এইভাবে স্ট্যাকের ওভারফ্লো ব্যতিক্রম সরবরাহ করে।
ডেভিড কনরাড

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। পুনরাবৃত্তিটি জেডিকের স্বাভাবিক-অনিচ্ছুক printStackTrace()আচরণের মধ্যে এবং ডিবাগিং এবং লগিংয়ের জন্য তৃতীয় পক্ষের গ্রন্থাগারটি ব্যতিক্রম পরিদর্শন করতে ব্যবহৃত হয়। আরও সম্ভবত, সম্ভবত যেখানে ব্যতিক্রম নিক্ষেপ করা হয়েছে সেই জায়গাটি যেখানে এটি পরিচালনা করা হয়েছে তার থেকে খুব দূরে।

যাইহোক, এখানে এমন একটি কোড যা কোনও ছুঁড়ে না ফেলে 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
: ডি এবং এখন ক্রস জাভা সংস্করণ স্ট্যাকওভারফ্লো অনুগত পদ্ধতি সহ। দুষ্ট জারজ! : ডি
কিউই

9
আমি এই ক্ষেত্রে পুনরাবৃত্তি বিবেচনা করতে আগ্রহী।
তাইমির

1
@ ব্ল্যাকলাইটশাইনিং getCause()পদ্ধতিতে কল করার ফলাফল হয় না StackOverflowError। এটি নির্ভর করে যে একটি জেডিকে কোড রয়েছে যা পুনরাবৃত্তভাবে getCause()পদ্ধতিটি কল করে ।
ভিক্টর স্টাফুসা

2
আমি ভেবেছিলাম তুমি লাশ পরিবর্তন করে এই প্রক্রিয়া সহজ পারে getCauseশুধু return this;কিন্তু দৃশ্যত জাভা যে জন্য খুব চালাক। এটি লক্ষ্য করে যে এটি একটি " CIRCULAR REFERENCE"।
ডেভিড কনরাড

1
আমি পান নি StackOverflowErrorকারণ JDK-1.7.0.21p2v0 এর OpenBSD 5.5 প্যাকেজ একটি বাগ আছে। এটা ছুঁড়ে না StackOverflowError। এটি হিট SIGSEGVএবং কোর ডাম্পস।
kernigh

57

লিনাক্স x86 এনএএসএম সমাবেশ Assembly

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

ভক্ষক:

প্রিন্ট হেলো থেকে ফিরতে ভুলে যাচ্ছি, তাই আমরা আবার _ স্টার্টে ঝাঁপ দাও।


78
সমাবেশে, কিছুই স্পষ্ট হয় না।
11684

21
@ 11684: আমি এর বিপরীতটি সত্য বলে মনে করি: সমাবেশে, সমস্ত কিছু সুস্পষ্ট কারণ তাদের কোডটি আসলে কী করছে তা লুকানোর জন্য কেউ বিমূর্ততা ব্যবহার করতে পারে না।
ম্যাসন হুইলারের

3
এটি এর সরলতা এবং কমনীয়তার জন্য উজ্জ্বল।
হানিফমুবারক

11
@ মেসনভিয়েল: আমি বলতে পছন্দ করি যে সুস্পষ্টর পরিবর্তে সবকিছু দৃশ্যমান ... দৃশ্যমান এবং সুস্পষ্ট মধ্যে পার্থক্যটি দেখার জন্য আমি আন্ডারহ্যান্ড.এক্সকোট.কম
অলিভিয়ার দুলাক

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 ++: অভ্যন্তরীণ সংকলক ত্রুটি: বিভাগের ত্রুটি (প্রোগ্রাম সিসি 1 প্লাস)
দয়া করে একটি পূর্ণ বাগ রিপোর্ট জমা দিন,
প্রিপ্রোসেসেড উত্স সহ যদি উপযুক্ত হয়।
নির্দেশাবলী জন্য দেখুন।

এই উত্স ফাইলটিতে কোন পুনরাবৃত্তি নেই, ক্লাসগুলির একটিরও নিজস্ব বর্গ শ্রেণি হিসাবে নেই, এমনকি অপ্রত্যক্ষভাবেও নয়। (সি ++ তে, এটির মতো কোনও টেম্পলেট শ্রেণিতে S<1>এবং S<2>এটি সম্পূর্ণ স্বতন্ত্র শ্রেণি)


7
আমি স্বীকার করি যে আমি আপনার রূপকল্পে এটিকে একটি সুস্পষ্ট পুনরাবৃত্তি বলে আছি।
বাদ এবং আপত্তিজনক

2
জিসিসি পুনরাবৃত্তি সনাক্ত করে এবং মনোযোগ দিয়ে এই দিকে থামিয়ে দেয় (৪.৮ এবং তারপরে এটি ভাল মনে হয়)
অ্যালেক টেলি

2
template <typename T> auto foo(T t) -> decltype(foo(t)); decltype(foo(0)) x;কিছুটা খাটো
কেসি 21

2
@hvd মনে হয় এটি জিসিসিতে কোনও বাগ ব্যবহার করছে। ঝাঁকুনি ভুল ব্যবহার ধরা পড়ে - যা আমি ধরে নিয়েছি আপনি ইতিমধ্যে সচেতন - তবে এটি আমার জিসিসির প্রায় 2 মেগাবাইট ত্রুটি বার্তাগুলি স্প্য করে।
কেসি


45

বাশ (বিপদ সতর্কতা)

while true
do 
  mkdir x
  cd x
done

কড়া কথায় বলতে গেলে, এটি সরাসরি ওভারফ্লোকে স্ট্যাক করবে না, তবে " ধ্রুবক স্ট্যাক-ওভার-ফ্লো জেনারেটিং পরিস্থিতি " হিসাবে লেবেলযুক্ত এমনটি তৈরি করে : আপনার ডিস্কটি পূর্ণ না হওয়া পর্যন্ত আপনি যখন এটি চালান, এবং "আরএম-আরএফ দিয়ে গণ্ডগোলটি সরাতে চান" এক্স ", যে একটি আঘাত।

যদিও এটি সমস্ত সিস্টেমে ঘটে না। কিছু অন্যদের চেয়ে বেশি শক্তিশালী।

বড় বিপদ সতর্কতা:

কিছু সিস্টেম এটি খুব খারাপভাবে পরিচালনা করে এবং আপনার পরিষ্কার করার জন্য খুব কঠিন সময় থাকতে পারে (কারণ "আরএম-আরএফ" নিজেই একটি পুনরুদ্ধারের সমস্যার মধ্যে চলে আসবে)। পরিষ্কার করার জন্য আপনাকে একই ধরণের স্ক্রিপ্ট লিখতে হতে পারে।

নিশ্চিত না হলে স্ক্র্যাচ ভিএম এ আরও ভাল করে চেষ্টা করুন।

PS: একই প্রয়োগ করা হয় অবশ্যই, যদি প্রোগ্রাম করা হয় বা ব্যাচের স্ক্রিপ্টে করা হয়।
পিপিএস: আপনার বিশেষ সিস্টেমটি কীভাবে আচরণ করে তা আপনার কাছ থেকে কোনও মন্তব্য পেতে বাধা দিতে পারে ...


যেমনটি আমি লিখেছি: অনেক সিস্টেমে, আরএম-আরএফ নীচে নেওয়ার চেষ্টা করে এবং একটির দ্বারা আঘাত করা হয় (সম্ভবত আর নয়, এই দিনগুলিতে, address৪ বিটের ঠিকানার স্থান - তবে একটি ছোট স্ট্যাকযুক্ত ছোট মেশিনে, এটি হতে পারে)। অবশ্যই, আশেপাশে "আরএম"-বাস্তবায়নও হতে পারে, যা এটি আলাদাভাবে করে ...
ব্লেবলা 999

2
আমার মনে হয় এরকম কিছু while cd x; do :; done; cd ..; while rmdir x; cd ..; done;যত্ন নেওয়া উচিত।
ব্ল্যাকলাইট জ্বলজ্বল করা

আপনি একেবারে ঠিক বলেছেন ("ক্লিনআপের জন্য অনুরূপ স্ক্রিপ্ট" দিয়ে আমি এটাই বুঝি) যাইহোক, একবার আপনার ডিস্ক (বা কোটা) পূর্ণ হয়ে গেলে, আপনার পরে এমনকি লগ ইন করতে খুব বেশি সময় লাগতে পারে, কারণ কিছু সিস্টেমগুলি সেই পরিস্থিতির সাথে খারাপভাবে মোকাবেলা করত। আপনাকে মূল হিসাবে উঠতে হবে এবং স্ক্রিপ্টটি করতে হবে (যা আজকের সেই পিসিগুলিতে সহজ, তবে প্রায়শই প্রাচীন সময়ে ছিল, যখন কম্পিউটার যেখানে একাধিক ব্যবহারকারী ব্যবহার করেছিলেন)।
blabla999

মজার, এটি নীচের
স্মার্টটাক যাদুটির

কেউ উইন্ডোজ এ চেষ্টা করেছেন?
সার্জে বোর্স

43

জাভা

থেকে একটি চমৎকার এক জাভা Puzzlers । এটি কী মুদ্রণ করে?

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");
        }
    }
}

এটি আসলে স্ট্যাকওভারফ্লো এরিয়ারে ব্যর্থ হয়।

কনস্ট্রাক্টর ব্যতিক্রম কেবল একটি লাল হেরিং। এটি সম্পর্কে বইয়ের বক্তব্যটি এই:

আপনি যখন কোন কনস্ট্রাক্টরকে ডাকেন, ইনস্ট্যান্ট ভেরিয়েবল ইনিশিয়েলাইজারগুলি কনস্ট্রাক্টরের শরীরে আগে চলে । এই ক্ষেত্রে, ভেরিয়েবলের জন্য internalInstanceআরম্ভকারীটি পুনরুক্তি করে কনস্ট্রাক্টরকে অনুরোধ করে। সেই কনস্ট্রাক্টর internalInstanceঘুরেফিরে, অনিচ্ছাকৃত কনস্ট্রাক্টরকে আবার অনুরোধ করে নিজের ক্ষেত্রের সূচনা করে ad এই পুনরাবৃত্তির অনুরোধগুলি StackOverflowErrorকনস্ট্রাক্টর বডি কার্যকর করার সুযোগ পাওয়ার আগেই একটি কারণ ঘটায় । কারণ পরিবর্তে StackOverflowErrorএকটি সাব টাইপ , ক্যাচ ক্লজটি এটি ধরেনা।ErrorExceptionmain


41

ক্ষীর

\end\end

ইনপুট স্ট্যাক উপচে কারণ \endবারবার, একটি অসীম লুপ নিজেই বিস্তৃতি যেমন ব্যাখ্যা করেছেন এখানে

টেক্স একটি TeX capacity exceeded, sorry [input stack size=5000]বা অনুরূপ সাথে ব্যর্থ হয় ।


1
আমি একটি টেক্স / ল্যাটেক্স ইস্যুর জন্য অপেক্ষা করছিলাম। এই জিনিসগুলি বেশিরভাগের চেয়ে বেশি ঝাঁকুনির সাথে থাকে - সাধারণত, আমি ভুলে গিয়েছি যে আমি যখন প্রোগ্রামিং হিসাবে গণনা করি তখন হঠাৎ আমি এমন কিছু লিখতে পেরেছি যা অসীম পুনরাবৃত্তিযোগ্য।
এর্নির


1
"টেক্সের ক্ষমতা অতিক্রম করেছে, দুঃখিত" ব্যর্থ হলে টেক্স খুব নম্র হয়।
অ্যালেক্স এ।

40

বি ফল

শেষ পর্যন্ত স্ট্যাকটি উপচে পড়বে, দোভাষী দের জন্য কতক্ষণ স্ট্যাক তৈরি করে তা নির্ভর করে ...

+[>+]

5
এই কোডটি আমাকে জীবনের গেমের কথা মনে করিয়ে দেয়।
অ্যাডাম আর্বল্ড

10
কড়া কথায় বলতে গেলে ব্রেনফাকের কোনও স্ট্যাক নেই।
ফেজেসোকো

6
@fejesjoco টেপ, আপনি যদি চান।
টিমটেক

32

সি #, সংকলন সময়ে

মাইক্রোসফ্ট সি # সংকলককে তার স্ট্যাকটি ফুঁকতে দেওয়ার বিভিন্ন উপায় রয়েছে; যে কোনও সময় আপনি দেখতে পেয়েছেন যে "অভিব্যক্তিটি সংকলন করতে খুব জটিল" সিআর সংকলক থেকে ত্রুটি যা প্রায় অবশ্যই কারণ স্ট্যাকটি ফুটিয়েছে।

পার্সারটি পুনরাবৃত্তির উত্স, সুতরাং কোনও গভীরভাবে নেস্ট করা ভাষা কাঠামোগুলি স্ট্যাকটি ফুটিয়ে তুলবে:

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

এক্সপ্রেশন পার্সার সাধারণভাবে পুনরাবৃত্তি হওয়া পক্ষের পুনরাবৃত্তিগুলি অপসারণ সম্পর্কে বেশ স্মার্ট। সাধারণত:

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

যা প্রচুর গভীর পার্স গাছ তৈরি করে, স্ট্যাকটি ফুঁকবে না। তবে আপনি যদি অন্যদিকে পুনরাবৃত্তি করতে বাধ্য করেন:

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

তারপরে স্ট্যাকটি ফুঁকতে পারে।

এগুলির অযোগ্য সম্পত্তি যা প্রোগ্রামটি খুব বড় very অর্থসূচক বিশ্লেষককে একটি ছোট প্রোগ্রামের সাথে আনবাউন্ডেড পুনরাবৃত্তিতে যেতে সক্ষম করাও এটি টাইপ সিস্টেমে নির্দিষ্ট বিজোড় চক্র অপসারণ করার জন্য যথেষ্ট স্মার্ট নয়। (রোজলিন সম্ভবত এটির উন্নতি করতে পারে))

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)। এই ত্রুটি বার্তার জন্য ডকুমেন্টেশন এখানে এবং আপনি যেমনটি বলেছেন ঠিক তেমন: "আপনার কোডটি প্রক্রিয়াকরণকারী সংকলকটিতে একটি স্ট্যাক ওভারফ্লো ছিল।"
বিডব্লুড্রাকো

32

ইন্টারনেটে (বিলিয়ন মানুষ / দিন দ্বারা ব্যবহৃত)

Redirects, HTTP status code: 301

উদাহরণস্বরূপ, ডেল সমর্থন ওয়েবসাইটে (কোনও অপরাধ নেই, দুঃখিত ডেল):

আপনি যদি ইউআরএল থেকে সমর্থন TAG সরিয়ে থাকেন তবে তা অসীম পুনর্নির্দেশগুলিতে যায় । নিম্নলিখিত ইউআরএলে, ####### কোনও সমর্থন ট্যাগ।

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

আমি বিশ্বাস করি এটি স্ট্যাক ওভারফ্লো এর সমতুল্য।


5
দুর্দান্ত উপায় :) ফায়ারফক্স জানিয়েছে যে এটি পুনর্নির্দেশ করে যাতে অনুরোধটি সমাধান করা যায় না যা স্ট্যাকওভারফ্লো rquivalent :)
মাস্টারএক্স 244

3
মনে রাখবেন যে পুনর্নির্দেশগুলি অসীম নয় - আপনি যদি "আবার চেষ্টা করুন" /Errors/চাপেন তবে এটি URL এ আরও কয়েকটি যুক্ত করে এবং তারপরে HTTP 400 খারাপ অনুরোধ পাওয়ার পরে থামে। তবে এটি যুক্তিযুক্তভাবে অসীম পুনর্নির্দেশের চেয়ে আরও ভাল স্ট্যাক ওভারফ্রোকে তৈরি করে।
nandhp

@ নান্দহ্প, আমি সম্মত, তবে আপনি যদি কোনও তৃতীয় বিশ্বের ব্রাউজার (আধুনিক নয়, ইত্যাদি ইত্যাদি) ভাবেন, তবে তারা এই অবস্থার সন্ধান পাননি।
কোডসেটর


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এখানে পুনরায় নিয়োগের সময় )। অ্যারে খুব গভীর (স্ব-রেফারেন্সিং) এবং তারপরে আবর্জনা সংগ্রহকারী একটি পুনরাবৃত্তিতে শেষ হয় because


16
পিএইচপি এর জিসি স্ব-রেফারেন্টিয়াল কাঠামো সনাক্ত করতে পারে না? সত্যি ?! সেকি। যে হয় মন্দ।
পিটার সি

1
হ্যাঁ, তবে এটি নিখুঁত নয়। এর কারণ while (1) { $a = array(&$a); }বা এর অনুরূপ কিছু কেবল মেমরির সীমাতে আঘাত
হানার কারণ রয়েছে

হ্যাঁ, আমি মনে করি এটি একই কারণেই পিএইচপি হয় না কেন অবজেক্ট ওরিয়েন্টেড বিকাশের বিষয়ে সঠিকভাবে কাজ করছে না; (বিমূর্ততা, উত্তরাধিকার ইত্যাদি)
পাইথোনিয়ান 29033

1
@ পাইথোনিয়ান 29033 বিস্তৃত যত্ন?
ভভন্ড্রা

30

জাভা

আমি ঠিক এর বিপরীতটি করেছি - এমন একটি প্রোগ্রাম যা স্পষ্টতই স্ট্যাকের ওভারফ্লো ত্রুটি ছুঁড়ে ফেলা উচিত, কিন্তু হয় না।

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

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

ইঙ্গিত: প্রোগ্রামটি ও (2 এন ) সময়ে চলে এবং এন স্ট্যাকের আকার (সাধারণত 1024)।

থেকে জাভা Puzzlers # 45:

আসুন ধরে নেওয়া যাক যে আমাদের মেশিনটি প্রতি সেকেন্ডে 10 10 টি কল চালাতে পারে এবং প্রতি সেকেন্ডে 10% ব্যতিক্রম উত্পন্ন করতে পারে , যা বর্তমান মানদণ্ডে বেশ উদার। এই অনুমানের অধীনে, প্রোগ্রামটি প্রায় 1.7 × 10 291 বছরের মধ্যে শেষ হবে । এটিকে পরিপ্রেক্ষিতে বলার জন্য, আমাদের সূর্যের জীবদ্দশায় 10 বছর অনুমান করা হয় , সুতরাং এটি নিরাপদ বাজি যে আমরা কেউই এই প্রোগ্রামটি শেষ হতে দেখব না। যদিও এটি অসীম লুপ নয়, এটি পাশাপাশি হতে পারে।


3
স্পষ্টত পুনরাবৃত্তি ... খুব আকর্ষণীয় নয়।
কামি

5
@ কামি আপনি কি চেষ্টা করেছেন? আপনি কি আসলে স্ট্যাকওভারফ্লো এরর পেয়েছেন? এটি সুস্পষ্ট বলে মনে হয়, তবে তা নয়।
ntoskrnl

কেবল ব্যতিক্রম ধরা পড়ার অর্থ এই নয় যে এটি কখনও নিক্ষেপ করা হয়নি। এই প্রোগ্রামটি ও (এন)
ছুঁড়েছে

1
@ কোডসইনচাওস ঠিক আছে, তাই আমি এটি ডাবল-চেক করেছি এবং সঠিক সংস্করণটি এর finallyপরিবর্তে ব্যবহার করে catch, এবং চলমান সময় হ'ল (2 ^ n)। উত্তর আপডেট হয়েছে।
ntoskrnl

@ntorkrnl ভাল এক +1 '; বিটিডব্লিউটি ইতিমধ্যে
স্ট্যাকওভারফ্লোতে সংকলকটি

30

সি শার্প

প্রথম পোস্ট, তাই দয়া করে আমার উপর সহজ যান।

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

এটি কেবল স্ট্যাক ট্রেস তৈরি করে, উপরের ফ্রেমটি ধরে ফেলে (যা আমাদের শেষ কল হবে Main()), পদ্ধতিটি পেয়ে যায় এবং এটিকে অনুরোধ করে।


স্বাবলম্বনের দুর্দান্ত উপায় যা ব্যাখ্যা ছাড়াই সুস্পষ্ট নয়; +1 '
X244

আপনার কোডটি "সম্ভবত কী ভুল হতে পারে?" দিয়ে মন্তব্য করা উচিত: পি
স্পেসম্যান

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
হাঁ; কোনও কিছুর বাইরে স্ট্যাকওভারফ্লোগুলি কোডেট্রোলিংয়ের জন্য সেরা বন্ধু এবং তাদের শিকারের গুরুতর মাথাব্যথা
মাস্টারএক্স 244

2
যদি কেউ বিস্মিত হন, সি # তে সমমানের কোডটি একটি অসীম লুপ তৈরি করে। তবে InnerExceptionসম্পত্তি কেবল পঠনযোগ্য এবং নির্মাত্রে সেট করা আছে, সুতরাং এর কারণ হিসাবে প্রতিফলন প্রয়োজন।
অথারি

17

জাভাস্ক্রিপ্ট: অ recursive, পুনরাবৃত্তি ফাংশন পরিবর্তন

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

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

এখানে কোনও পুনরাবৃত্তি নেই। fযতক্ষণ না এটি একক ফাংশন কলটিতে স্ট্যাককে উপচে ফেলা যায় ততক্ষণ আরও বেশি করে যুক্তি দিয়ে বার বার ক্রিচ করা হবে console.logঅংশ ঐচ্ছিক ক্ষেত্রে তোমাকে দেখতে কত আর্গুমেন্ট এটা কি লাগে না। এটিও নিশ্চিত করে যে চালাক জেএস ইঞ্জিনগুলি এটিকে অপ্টিমাইজ করবে না।

কফিস্ক্রিপ্টে কোড-গল্ফ সংস্করণ, ২৮ টি অক্ষর:

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());
    }
}

এটি যেভাবে ব্যর্থ হয়েছে তা মহাকাব্য, এটি আমার মনকে পুরোপুরি উড়িয়ে দিয়েছে:

এখানে চিত্র বর্ণনা লিখুন

এটি অদ্ভুত চিত্রগুলির আপাতদৃষ্টিতে অসীম ট্রিপিং সিরিজের কেবল একটি ফ্রেম।

এটি এখন পর্যন্ত সবচেয়ে অদ্ভুত বিষয় হয়ে উঠেছে। কেউ কি ব্যাখ্যা করতে পারেন? স্পষ্টতই, ইন্ডেন্টেশনের জন্য ব্যবহৃত ক্রমবর্ধমান পরিমাণে সেই সাদা ব্লকগুলি উপস্থিত হওয়ার কারণ হয়ে থাকে। এটি নেট 7.4 এর সাথে উইন 7 এন্টারপ্রাইজ x64 এ ঘটে।

আমি আসলে এর শেষটি এখনও দেখিনি। আপনি যদি এটি প্রতিস্থাপন System.Console.Outকরেন তবে System.IO.Stream.Nullএটি খুব দ্রুত মারা যায়।

ব্যাখ্যাটি বেশ সহজ। আমি একটি শ্রেণি তৈরি করি যার একটি একক সম্পত্তি রয়েছে এবং এটি সর্বদা এর ধারণিত ধরণের একটি নতুন উদাহরণ দেয়। সুতরাং এটি একটি অসীম গভীর অবজেক্ট শ্রেণিবদ্ধ। এখন আমাদের এমন কিছু প্রয়োজন যা এর মাধ্যমে পড়ার চেষ্টা করে। আমি যেখানে এটি ব্যবহার করি XmlSerializer, যা কেবল এটি করে। এবং স্পষ্টতই, এটি পুনরাবৃত্তি ব্যবহার করে।


হাঁ; সিরিয়ালাইজিং এফটিডব্লিউ: পি; তবে আরও মজার বিষয় যখন আপনার কৌতুকটি সম্পূর্ণভাবে আপনার কোডের বাইরে থাকে যেমন স্নায়ামাল কীভাবে গুণাবলী লাভ করে এবং একটি শ্রেণি নিজেকে এমনভাবে ফিরে আসে যে শেষ পর্যন্ত পুনরাবৃত্তি করে
মাস্টারএক্স 244

1
ঠিক আছে, ওভারফ্লো আমার কোডের বাইরে ঘটে, তবে আমি এটি পোস্ট করার আসল কারণটি
কনসোলটিতে

আমি মনে করি সাদা বিটগুলি অবশ্যই করা উচিত। নেট 4.5 বা আপনার পরিবেশটি কীভাবে সেট আপ করা হয়, কারণ নেট 4 ব্যবহার করে (এমনকি যখন সেন্টিমিটার দিয়ে চালানো হয়) আমি কেবল ফাঁকা স্থান পাই, কোনও সাদা ব্লক নেই। আমার অনুমান যেটি হয় সেন্টিমিডির উইন 7 এন্টারপ্রাইজ সংস্করণ বা। নেট 4.5 কনসোল এমুলেটর একটি নির্দিষ্ট অক্ষরের সংমিশ্রণটিকে 'কনসোল রঙের ব্যাকগ্রাউন্ড পরিবর্তন' হিসাবে বিবেচনা করে।
ফারাপ

আমি এটিকে উইন 7 x64 এ .NET 4.5 এর সাথে পুনরায় উত্পাদন করতে পারছি না সাথে এ্যারো চালু হয়েছে
রায়

হয় না পুনরুত্পাদন। .NET 4.5, উইন্ডোজ 8.1 প্রো।
বিডব্লিউড্রাকো

13

সজোরে আঘাত

_(){ _;};_

যদিও অনেকে চিনতে পারেন যে পুনরাবৃত্তিটি সুস্পষ্ট , তবে এটি বেশ সুন্দর দেখাচ্ছে। কোন?

মৃত্যুদন্ড কার্যকর হওয়ার পরে, আপনি দেখার নিশ্চয়তা:

Segmentation fault (core dumped)

5
এটি একটি সুন্দর এবং আরও খারাপ:_(){_|_;};_
আরএসফালকন 7

1
@ আরএসফালকন For ফর্কবম্ব সতর্কতা! (এছাড়াও, {সিনট্যাক্টিক্যালি সঠিক হওয়ার জন্য কি এটির জন্য কোনও জায়গার দরকার নেই ?)
ব্ল্যাকলাইট

3
:(){:|:;}:
এটিও

14
দেখতে একটি চতুর, মিউট্যান্ট ইমোটিকনের মতো।
টিম সেগুইন

8
বাশ ইমোটিকনস: মুখের ভাত, স্ট্যাকের ঘাতক।
NobleUplift

12

Haskell,

(দুঃখজনক হলেও কমপক্ষে সত্য ghc-7.6, যদিও এর O1বেশি বা আরও বেশি সমস্যা সমাধান করবে)

main = print $ sum [1 .. 100000000]

এটি একটি লেজ কল অপ্টিমাইজেশন স্বয়ংক্রিয়ভাবে করা উচিত না (যোগফল)?
blabla999

2
@ ব্লেব্লা৯৯৯৯: লেজ-কলগুলি হাস্কেলের সাথে প্রাসঙ্গিক নয়, গোপন আলস্যতার কারণে এটি বেশিরভাগ ক্ষেত্রেই নষ্ট হয়ে যায় যা এ জাতীয় সমস্যার সৃষ্টি করে। এই ক্ষেত্রে, বিষয়টি হ'ল sumশর্তাবলী কার্যকর করা হয় foldl, যা টেল কলগুলি ব্যবহার করে, তবে কারণ এটি সঞ্চয়ের কঠোরভাবে মূল্যায়ন না করে কেবল আসল তালিকার মতো বৃহত থাঙ্ক সৃষ্টি করে। স্যুইচ করার সময় সমস্যাটি অদৃশ্য হয়ে যায় foldl' (+), যা কঠোরভাবে মূল্যায়ন করে এবং এভাবে ডাব্লুএইচএইচএনকে তার টেল কলটিতে রিটার্ন দেয়। বা, যেমনটি আমি বলেছি, আপনি যদি জিএইচসি-র অপ্টিমাইজেশানগুলি চালু করেন!
পাল্টে ঘড়ির

আহ - আকর্ষণীয়, সুতরাং কেউ যদি থাঙ্কের জন্য অপেক্ষা না করে (অর্থাত্ মুদ্রণটি ফেলে রাখে), আবর্জনা সংগ্রহকারী তাদের এগুলি সংগ্রহ করবে (সামনে থেকে পিছনে)?
blabla999

1
বিটিডব্লিউ, এর কিছুই সত্যই হাস্কেল স্ট্যান্ডার্ড দ্বারা নির্দিষ্ট করা হয়নি: এর কেবল প্রয়োজন যে মূল্যায়ন অ-কঠোর , অর্থাত্ যদি সম্পূর্ণরূপে প্রয়োজনীয়তা না হয় তবে একটি অবিচ্ছিন্ন গণনা চিরতরে অবরুদ্ধ হবে না । এটি বাস্তবায়নের জন্য কতক্ষণ অবরুদ্ধ থাকে, প্রমিত অলস জিএইচসি-তে আপনি ফলাফলটির অনুরোধ না করা পর্যন্ত এগুলি মোটেই অবরুদ্ধ হয় না।
পাল্টা

2
হাস্কেল দুর্দান্ত
blabla999

12

স্বল্প কথা

এটি ফ্লাইতে একটি নতুন পদ্ধতি
  তৈরি করে , যা উড়ে একটি নতুন পদ্ধতি
    তৈরি করে , যা উড়ে একটি নতুন পদ্ধতি তৈরি করে, যা
      ...
    ...
  ..
এবং তারপরে এটি স্থানান্তর করে।

স্ট্যাক মেমরি এবং হ্যাপ মেমরিকে একই সাথে চাপ দেওয়া, একই সাথে দীর্ঘ এবং দীর্ঘ পদ্ধতির নাম এবং রিসিভার হিসাবে একটি বিশাল সংখ্যক উভয়ই তৈরি করে যখন আমরা গর্তের নীচে পড়ে যাই তখন একটি অতিরিক্ত ছোট মশলা আসে but )।

পূর্ণসংখ্যায় সংকলন:

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"...
... কিছুক্ষণ পরে, আপনি একটি ডিবাগারে শেষ হবেন, একটি পুনরাবৃত্তি এক্সেক্সশন দেখিয়ে।

তারপরে আপনাকে সমস্ত জগাখিচুড়ি পরিষ্কার করতে হবে (স্মলইন্টিজার এবং লার্জইন্টিজার উভয়েরই এখন প্রচুর আশ্চর্যজনক কোড রয়েছে):

{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...

পিএস: পরে "স্মার্টটাকের অবিচ্ছিন্ন পরিবর্তন-লগ ফাইলটি সাফ না করা এড়ানোর জন্য" "আপডেট না করে চ্যাঞ্জস ফাইল:" যুক্ত করা হয়েছিল।

পিপিএস: চ্যালেঞ্জের জন্য ধন্যবাদ: নতুন এবং উদ্ভাবনী কিছু সম্পর্কে চিন্তা করা মজা ছিল!

পিপিপিএস: আমি নোট করতে চাই যে কিছু স্মলটাক ডায়ালিক / সংস্করণগুলি ওভারফ্লো করা স্ট্যাক ফ্রেমগুলিকে হিপগুলিতে অনুলিপি করে - সুতরাং এটি পরিবর্তে স্মৃতি থেকে সরে যেতে পারে।


2
তার কালো জাদুটির শুদ্ধ আকারে LOL +1
মাস্টারএক্স 244

আমি যদি কিছুটা সময় পাই তবে অন্ধকার খরগোশের গর্তটিকে
অনাবৃত

12

সি শার্প

সত্যই বড় struct, কোনও পুনরাবৃত্তি, খাঁটি সি #, অনিরাপদ কোড নয়।

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.}


এবং জেনেরিক সংস্করণ (এনপিএসএফ 3000 পরামর্শের জন্য ধন্যবাদ)

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>>>>();
    }
}

আরও জেনেরিক কোড
মেথিংসের

এটি পুনরাবৃত্তির মতো দেখায় তবে নেস্টেড ধরণের যুক্তি দিয়ে এটি সম্ভব।
j72

1
আমার পোস্ট করার আগে আপনার সি # স্ট্রাক্ট উত্তরটি দেখেনি। আমার এখনও কিছুটা ভিন্ন দৃষ্টিভঙ্গি রয়েছে, তাই সম্ভবত আমরা তাদের সহাবস্থান করতে দেব।
টমাস ওয়েলার

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

স্নেকইএএমএল ব্যবহার করে উত্তর শুরু করা হচ্ছে

class A
{

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

সম্পাদনা: এটি অবরুদ্ধ

কীভাবে এটি কাজ করে তা খুঁজে পাওয়ার জন্য এটি পাঠকের উপর নির্ভর করে: পি (টিপ: স্ট্যাকওভারফ্লো ডটকম)

উপায় দ্বারা: পুনরাবৃত্তিটি স্নেকইএএমএল দ্বারা গতিশীলভাবে করা হয়েছে (আপনি খেয়াল করবেন যে এটি কীভাবে ক্ষেত্রগুলি ক্রমযুক্ত করে এবং এটি কীভাবে সন্ধান করে তা কীভাবে সনাক্ত করে তা যদি আপনি জানেন তবে Point )

সম্পাদনা করুন: কীভাবে এটি কাজ করে তা জানান:

স্নেকইএএমএল একটি জুটির সন্ধান করে getXXXএবং setXXXগাথর একই নামের সাথে মিথর এবং গিটারের XXXরিটার্ন টাইপের সেটটারের প্যারামিটারের সমান; এবং আশ্চর্যজনকভাবে ক্লাসটির Pointএকটি রয়েছে Point getLocation()এবং void setLocation(Point P)যা নিজেই ফিরে আসে; স্নেকইএএমএল এটি লক্ষ্য করে না এবং সেই শিরা এবং স্ট্যাকওভারফ্লোতে পুনরাবৃত্তি করে। একটিতে তাদের সাথে কাজ করার সময় HashMapএবং এটিতে স্ট্যাকওভারফ্লো ডটকমের বিষয়ে জিজ্ঞাসা করার সময় এটি আবিষ্কার করে।


10

সি শার্প

ভুলভাবে সম্পত্তি প্রয়োগকারী কার্যকর করা হয়েছে

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

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

14
এই প্রোগ্রামটিতে। এটি একটি সুস্পষ্ট পুনরাবৃত্তির জন্য একটি সর্বোত্তম উদাহরণ ... (এবং তাই বৈধ নয়)
ওলে অ্যালবার্স

2
ঠিক আছে, এটি একবারে স্পষ্ট হয়ে গেলে আপনি এটি একবারে করে ফেললেন এবং বুঝতে পেরেছেন যে সি # গ্রাহকরা যেভাবে আপনারা ভেবেছিলেন তারা যেভাবে কাজ করে না সেভাবে কাজ করে না। সর্বোপরি, এই কোডটি একটি সদস্যের পরিবর্তনশীল ঘোষণা, সুতরাং কেন এটি একটি আসল সদস্য পরিবর্তনশীল তৈরি করা উচিত নয়?
meustrus

2
এটি করার মতো বিভ্রান্তিকর উপায় ছাড়া আর কোনও কিছুই নয়static void Main() { Main(); }
জোড্রেল

5
@ জোডরেল আপনি Main()দুর্ঘটনাক্রমে পুনরাবৃত্ত লিখবেন না । তবে দুর্ঘটনাক্রমে একটি পুনরাবৃত্ত সম্পত্তি লিখুন এবং তারপরে স্ট্যাকের ওভারফ্লোতে বিভ্রান্ত হবেন তা বেশ সহজ।
সুইভিক

1
এটি সি # বাছাই করা কারও পক্ষে কার্যকর হবে।
2rs2ts
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.