Stack overflow
سافٹ ویئر میں، اسٹیک اوور فلو اس وقت ہوتا ہے جب کال اسٹیک پوائنٹر اسٹیک باؤنڈ سے تجاوز کر جائے۔ کال اسٹیک ایڈریس کی جگہ کی ایک محدود مقدار پر مشتمل ہو سکتا ہے، جس کا تعین اکثر پروگرام کے آغاز میں کیا جاتا ہے۔ کال اسٹیک کا سائز بہت سے عوامل پر منحصر ہوتا ہے، بشمول پروگرامنگ زبان، مشین فن تعمیر، ملٹی تھریڈنگ، اور دستیاب میموری کی مقدار۔ جب کوئی پروگرام کال اسٹیک پر دستیاب جگہ سے زیادہ جگہ استعمال کرنے کی کوشش کرتا ہے (یعنی جب وہ کال اسٹیک کی حدود سے باہر میموری تک رسائی حاصل کرنے کی کوشش کرتا ہے، جو کہ بنیادی طور پر ایک بفر اوور فلو ہوتا ہے)، تو اسٹیک کو اوور فلو کہا جاتا ہے، جس کے نتیجے میں عام طور پر پروگرام کریش ہوتا ہے۔ انفنائٹ ریکرشن کا سبب بنتا ہے اسٹیک اوور فلو کی سب سے عام وجہ حد سے زیادہ گہری یا لامحدود ریکرشن ہوتی ہے، جس میں ایک فنکشن خود کو اتنی بار کال کرتا ہے کہ ہر کال سے وابستہ متغیرات اور معلومات کو ذخیرہ کرنے کے لیے درکار جگہ اسٹیک پر فٹ ہونے سے زیادہ ہوتی ہے۔ سی۔ انٹ فو () {ریٹرن فو () ؛} میں لامحدود تکرار کی ایک مثال فنکشن فو، جب اسے بلایا جاتا ہے، تو ہر بار اسٹیک پر اضافی جگہ مختص کرتے ہوئے خود کو مدعو کرتا رہتا ہے، جب تک کہ اسٹیک اوور فلو نہ ہو جس کے نتیجے میں سیگمنٹشن فالٹ ہو۔ تاہم، کچھ مرتب ٹیل کال آپٹیمائزیشن کو نافذ کرتے ہیں، جس سے ایک مخصوص قسم کی لامحدود تکرار-ٹیل ریکرشن-اسٹیک اوور فلو کے بغیر ہوتی ہے۔ یہ کام کرتا ہے کیونکہ ٹیل ریکرشن کالز اضافی اسٹیک کی جگہ نہیں لیتی ہیں۔ کچھ سی کمپائلر آپشنز ٹیل کال آپٹیمائزیشن کو مؤثر طریقے سے فعال کریں گے ؛ مثال کے طور پر،-O1 کے ساتھ جی سی سی کا استعمال کرتے ہوئے مذکورہ بالا سادہ پروگرام کو مرتب کرنے کے نتیجے میں سیگمنٹشن فالٹ ہوگا، لیکن-O2 یا-O3 کا استعمال کرتے وقت نہیں، کیونکہ یہ آپٹیمائزیشن لیولز-آپٹیمائز-سائبلنگ-کالز کمپائلر آپشن کو ظاہر کرتی ہیں۔ دوسری زبانیں، جیسے اسکیم، زبان کے معیار کے حصے کے طور پر دم کی تکرار کو شامل کرنے کے لیے تمام نفاذ کی ضرورت ہوتی ہے۔ بہت گہری تکرار ایک تکرار فنکشن جو نظریہ میں ختم ہوتا ہے لیکن عملی طور پر کال اسٹیک بفر اوور فلو کا سبب بنتا ہے اسے تکرار کو لوپ میں تبدیل کرکے اور فنکشن کے دلائل کو ایک واضح اسٹیک میں محفوظ کرکے (کال اسٹیک کے مضمر استعمال کے بجائے) طے کیا جا سکتا ہے۔ یہ ہمیشہ ممکن ہے کیونکہ ابتدائی تکراری افعال کی کلاس ایل او او پی کمپیوٹیبل افعال کی کلاس کے مساوی ہے۔ اس مثال پر C + + جیسے سڈو کوڈ میں غور کریں: بائیں طرف کی طرح ایک ابتدائی تکراری فنکشن کو ہمیشہ دائیں طرف کی طرح لوپ میں تبدیل کیا جا سکتا ہے۔ بائیں طرف کی مثال جیسی فنکشن ٹیل کال آپٹیمائزیشن کی حمایت کرنے والے ماحول میں کوئی مسئلہ نہیں ہوگی۔ تاہم، اب بھی ایک ریکرسو فنکشن بنانا ممکن ہے جس کے نتیجے میں ان زبانوں میں اسٹیک اوور فلو ہو سکتا ہے۔ دو سادہ انٹیجر ایکسپوینٹیشن فنکشنز کی نیچے دی گئی مثال پر غور کریں۔ اوپر دونوں پاؤ (بیس، ایکسپ) فنکشن ایک مساوی نتیجہ کا حساب لگاتے ہیں، تاہم، بائیں طرف والا فنکشن اسٹیک اوور فلو کا سبب بنتا ہے کیونکہ اس فنکشن کے لیے ٹیل کال آپٹیمائزیشن ممکن نہیں ہے۔ عمل کے دوران، ان فنکشنز کا اسٹیک اس طرح نظر آئے گا: نوٹ کریں کہ بائیں طرف موجود فنکشن کو انٹیجرز کے اسٹیک ایکسپو نمبر میں اسٹور کرنا چاہیے، جو کہ ریکرشن ختم ہونے پر ضرب دی جائے گی اور فنکشن 1 واپس کرے گا۔ اس کے برعکس، دائیں طرف کے فنکشن کو کسی بھی وقت صرف 3 انٹیجرز کو اسٹور کرنا چاہیے، اور ایک انٹرمیڈیٹری نتیجہ کا حساب لگاتا ہے جو اس کی اگلی دعوت پر منتقل ہوتا ہے۔ چونکہ موجودہ فنکشن کی دعوت سے باہر کوئی دوسری معلومات ذخیرہ نہیں کی جانی چاہیے، اس لیے ٹیل ریکرشن آپٹیمائزر پہلے کے اسٹیک فریموں کو "ڈراپ" کر سکتا ہے، جس سے اسٹیک اوور فلو کا امکان ختم ہو جاتا ہے۔ بہت بڑے اسٹیک متغیرات اسٹیک اوور فلو کی دوسری بڑی وجہ اسٹیک پر فٹ ہونے سے زیادہ میموری مختص کرنے کی کوشش سے ہوتی ہے، مثال کے طور پر مقامی صف متغیرات بنا کر جو بہت بڑے ہوتے ہیں۔ اس وجہ سے کچھ مصنفین تجویز کرتے ہیں کہ چند کلو بائٹس سے بڑی صفوں کو مقامی متغیر کے بجائے متحرک طور پر مختص کیا جانا چاہیے۔ سی میں ایک بہت بڑے اسٹیک متغیر کی مثال: انٹ فو () {ڈبل ایکس [1048576] ؛} 8 بائٹ ڈبل صحت سے متعلق فلوٹس کے ساتھ سی کے نفاذ پر، اعلان کردہ صف 8 میگا بائٹس ڈیٹا استعمال کرتی ہے۔ اگر یہ اسٹیک پر دستیاب میموری سے زیادہ ہے (جیسا کہ تھریڈ تخلیق کے پیرامیٹرز یا آپریٹنگ سسٹم کی حدود کے ذریعہ مقرر کیا گیا ہے)، تو اسٹیک اوور فلو ہوگا۔ اسٹیک اوور فلوز کو کسی بھی ایسی چیز سے بدتر بنایا جاتا ہے جو کسی دیئے گئے پروگرام کے موثر اسٹیک سائز کو کم کرتی ہے۔ مثال کے طور پر، ایک ہی پروگرام کا متعدد دھاگوں کے بغیر چلانا ٹھیک کام کر سکتا ہے، لیکن جیسے ہی ملٹی تھریڈنگ فعال ہو جائے گی پروگرام کریش ہو جائے گا۔ اس کی وجہ یہ ہے کہ تھریڈ والے زیادہ تر پروگراموں میں تھریڈنگ سپورٹ کے بغیر کسی پروگرام کے مقابلے میں فی تھریڈ کم اسٹیک اسپیس ہوتی ہے۔ چونکہ دانے عام طور پر ملٹی تھریڈ ہوتے ہیں، اس لیے دانے کی نشوونما کے لیے نئے لوگوں کو عام طور پر ریکرسو الگورتھم یا بڑے اسٹیک بفر استعمال کرنے سے حوصلہ شکنی کی جاتی ہے۔ بفر اوور فلو کال اسٹیک ہیپ اوور فلو اسٹیک اوور فلو ڈبل فالٹ حوالہ جات بیرونی لنکس 64 بٹ پروگراموں کو مزید اسٹیک میموری کی ضرورت کی وجوہات سافٹ ویئر کیڑے کمپیوٹر کی غلطیاں