กองล้นคืออะไร?

Stack overflow เป็นข้อผิดพลาดในการเขียนโปรแกรมซึ่งความพยายามในการเขียนข้อมูลไปยังบล็อกของหน่วยความจำโดยเฉพาะล้มเหลวเนื่องจากไม่มีพื้นที่เหลือในบล็อก ข้อผิดพลาดประเภทนี้เกิดขึ้นในลักษณะเดียวกับการโอเวอร์โฟลว์บัฟเฟอร์การโอเวอร์โฟลด์ฮีพและการโอเวอร์โฟลว์บัฟเฟอร์แบบสแต็ก ความแตกต่างระหว่างข้อผิดพลาดประเภทนี้ขึ้นอยู่กับโครงสร้างข้อมูลคอมพิวเตอร์ที่ใช้และคุณลักษณะทั่วไปคือมีความพยายามในการเขียนข้อมูลมากกว่าที่จะมีพื้นที่ว่างสำหรับเก็บข้อมูล

อาการของล้นล้นอาจแตกต่างกันไปขึ้นอยู่กับภาษาคอมพิวเตอร์ที่ใช้และเครื่องจักรการรายงานข้อผิดพลาดที่มีอยู่ ใน C ++ การโอเวอร์โฟลว์แบบสแต็กมักจะปรากฏว่าเป็นความผิดพลาดในการแบ่งเซกเมนต์และบ่อยครั้งที่ไม่มีข้อมูลเพิ่มเติมที่กำหนดไว้เพื่อกำหนดตำแหน่งหรือวิธีการโอเวอร์โฟลว์เกิดขึ้น โอเวอร์โฟลว์ใน Java มักจะส่งผลให้เกิดความผิดพลาดของเครื่องเสมือนที่ให้ไฟล์ข้อผิดพลาดที่มีรายละเอียดสมเหตุสมผล ไม่ว่าภาษาใดที่เกิดโอเวอร์โฟลว์โอเวอร์โฟลว์สามารถแก้ไขได้เกือบตลอดเวลาด้วยการดีบักและระบุแหล่งที่มาดั้งเดิมอย่างล้นหลาม

ภาษาคอมพิวเตอร์ที่มีการจัดการหน่วยความจำอย่างชัดเจนมักจะง่ายต่อการป้องกันการล้นสแต็ค การฝึกเขียนโปรแกรมที่ได้รับการยอมรับอย่างกว้างขวางมักจะบอกว่าสำหรับทุกส่วนของหน่วยความจำที่โปรแกรมจัดสรรโปรแกรมควรลบตัวเองออกไป C ++ อนุญาตกลไกนี้และการตรวจสอบอย่างระมัดระวังด้วยวิธีนี้สามารถรักษาจำนวนหน่วยความจำที่โปรแกรมใช้ให้น้อยที่สุด ภาษาที่ไม่มีการจัดการหน่วยความจำที่ชัดเจนและแทนที่จะใช้การจัดการหน่วยความจำโดยนัยนั้นยากที่จะป้องกันจากข้อผิดพลาดล้นสแต็ค Java จัดการหน่วยความจำของตัวเองภายในเครื่องเสมือนดังนั้นข้อมูลจะไม่ถูกลบอย่างชัดเจนเพื่อให้มีพื้นที่มากขึ้น

ข้อผิดพลาดทั่วไปของโปรแกรมเมอร์มือใหม่คือการสันนิษฐานว่าสแตกล้นไม่สามารถเกิดขึ้นได้ในภาษาคอมพิวเตอร์ที่จัดการการจัดการหน่วยความจำของตัวเอง ในขณะนี้ดูเหมือนจะเป็นไปได้ในตอนแรกมันไม่ได้เป็นอย่างนั้น ภาษาที่มีการจัดการหน่วยความจำโดยนัยมักมีตัวรวบรวมขยะที่ปล่อยบล็อกหน่วยความจำที่ไม่จำเป็น แต่ตัวรวบรวมขยะเหล่านี้จะไม่ทำงานในเวลาที่โปรแกรมเมอร์คาดหวัง การใช้ตัวรวบรวมขยะนั้นค่อนข้างอันตรายและไม่สามารถป้องกันโปรแกรมจากข้อผิดพลาดที่ล้นได้เสมอไป

ข้อผิดพลาดมากเกินไปอาจเป็นความหายนะและหยุดทั้งโปรแกรมหรือพวกเขาเกือบจะเงียบและอนุญาตให้โปรแกรมดำเนินการต่อไป ข้อผิดพลาดประเภทที่สองเหล่านี้มักจะหาได้ยากที่สุดเนื่องจากอาจเกิดข้อผิดพลาดที่มาจากการล้นโค้ดหลายบรรทัดก่อน สแต็คโอเวอร์โฟลว์มักไม่จำเป็นต้องทำการค้นหาผ่านทั้งโปรแกรม แต่ยิ่งโปรแกรมรันได้นานกว่าหลังจากโอเวอร์โฟลว์มากขึ้นข้อผิดพลาดที่ยากขึ้นก็อาจจะค้นหาและแก้ไขได้