ما هو Stack Overflow؟

Stack overflow هو خطأ في البرمجة تفشل فيه محاولة كتابة البيانات إلى كتلة معينة من الذاكرة بسبب عدم وجود مساحة متبقية في الكتلة. يحدث هذا النوع من الأخطاء بنفس الطريقة التي يحدث بها تجاوز سعة المخزن المؤقت ، وتدفقات كومة الذاكرة المؤقتة ، وتفيضات المخزن المؤقت للمكدس. يعتمد الاختلاف بين هذه الأنواع من الأخطاء على بنية بيانات الكمبيوتر المستخدمة ، والميزة الشائعة هي حدوث محاولة لكتابة بيانات أكثر من المساحة المتاحة للاحتفاظ بها.

يمكن أن تختلف أعراض تجاوز المكدس اعتمادًا على لغة الكمبيوتر المستخدمة وآلية الإبلاغ عن الأخطاء المتاحة. في C ++ ، غالبًا ما يظهر تجاوز سعة المكدس نفسه على أنه خطأ تجزئة ، وفي كثير من الأحيان لا توجد معلومات إضافية معطاة لتحديد مكان أو كيفية حدوث الفائض. غالبًا ما ينتج عن الفائض في Java تعطل الجهاز الظاهري الذي يعطي ملف خطأ مفصل بشكل معقول. بغض النظر عن اللغة التي يحدث بها تجاوز السعة ، يمكن دائمًا تصحيح الفائض عن طريق التصحيح المناسب وتحديد مصدر الفائض الأصلي.

غالبًا ما تكون لغات الكمبيوتر التي تقدم إدارة صريحة للذاكرة أسهل في الحماية من تجاوز سعة المكدس. عادةً ما تملي ممارسة البرمجة المقبولة على نطاق واسع أنه لكل جزء من الذاكرة يخصصها البرنامج ، يجب على البرنامج أيضًا حذف نفسه. يسمح C ++ بهذه الآلية ، ويمكن للمراقبة الدقيقة بهذه الطريقة أن تحافظ على مقدار الذاكرة التي يستخدمها البرنامج إلى الحد الأدنى. اللغات التي لا تقدم إدارة صريحة للذاكرة ، وبدلاً من ذلك تستخدم إدارة الذاكرة الضمنية ، يكون من الصعب حمايتها من أخطاء تجاوز المكدس. تتعامل Java مع ذاكرتها الخاصة داخل جهازها الظاهري ، لذلك لا يمكن حذف البيانات بشكل صريح حسب الرغبة لإفساح المجال للمزيد.

الخطأ الشائع للمبرمجين المبتدئين هو افتراض أن تجاوز سعة المكدس لا يمكن أن يحدث في لغات الكمبيوتر التي تتعامل مع إدارة الذاكرة الخاصة بهم. في حين أن هذا يبدو معقولاً في البداية ، إلا أنه ليس كذلك في الواقع. غالبًا ما تحتوي اللغات ذات إدارة الذاكرة الضمنية على مجمعات قمامة تعمل على تحرير كتل غير ضرورية من الذاكرة ، ولكن لا تعمل مجمعات القمامة هذه دائمًا في الوقت الذي يتوقعه المبرمج. يعد الاعتماد على جامعي القمامة أمرًا خطيرًا نسبيًا ، ولا يمكنه دائمًا حماية البرنامج من خطأ تجاوز التدفق.

يمكن أن تكون أخطاء تجاوز السعة كارثية وتوقف برنامجًا بأكمله ، أو يمكن أن تكون صامتة تقريبًا وتسمح لبرنامج ما بالاستمرار في التقدم. غالبًا ما يكون من الصعب العثور على هذه الأنواع الثانية من الأخطاء نظرًا لاحتمال حدوث خطأ ناتج عن تجاوز سطور عديدة من التعليمات البرمجية من قبل. غالبًا لا يتطلب تجاوز سعة المكدس البحث في برنامج بأكمله ، ولكن كلما طالت مدة تشغيل البرنامج بعد تجاوز السعة ، زادت صعوبة العثور على الخطأ وإصلاحه.