השחתת זיכרון (Memory corruption) היא שגיאה שבה אזור בזיכרון המחשב נכתב בטעות.
גורמים אפשריים: שגיאת תוכנה, תקלה בחומרה (Hard Error) או אירוע חיצוני שמשנה את הזיכרון (Soft Error).
תוצאה של השחתה יכולה להיות קריסה מיידית של התוכנית. לדוגמה, כתיבה לכתובת 0 בדרך כלל תגרום לשגיאת סגמנטציה. לעיתים ההשחתה לא נראית מיד, ובשימושים מסוימים התוכנית תחזיר תוצאה שגויה.
דוגמה נפוצה היא ניסיון כתיבה לתא במערך שלא קיים. בשפות כמו C, המערכים מדורגים מ‑0, ולכן האינדקס האחרון הוא n‑1. כתיבה לאינדקס מחוץ לטווח עלולה לדלוף אל זיכרון אחר שהשייך לאותה תוכנית ולשנות אותו.
פגיעות זו יכולה לשמש גם כחור אבטחה. כאשר קוראים לפונקציה, מעבירים לה פרמטרים ושומרים על המחסנית (stack) גם את כתובת החזרה, הכתובת שמהווה "לאן לחזור" בסיום הפונקציה.
אם פונקציה מקבלת קלט שמוכנס למערך ללא בדיקת גודל, תוקף יכול לשלוח קלט גדול במכוון. הקלט ימלא את המערך וידרס נתונים על המחסנית, כולל את כתובת החזרה. בכך התוקף יכול לשנות את הכתובת, וכשהפונקציה תסתיים המעבד יקפוץ לקוד שונה. כך אפשר להריץ פקודות זדוניות על המחשב שמריץ את התוכנית.
שפות כמו Java מבצעות בדיקה אוטומטית של גבולות מערך. ניסיון לחרוג מהגבולות בדרך כלל מייצר שגיאה בריצה.
קיימים גם כלי פיתוח כגון Valgrind שמאתרים גישות מחוץ לגבולות המערך בזמן בדיקות.
בתוכנות מסחריות גדולות, שמפותחות על‑ידי מתכנתים רבים ובקבצים רבים, מציאת באגים כאלה קשה. זה גם פוגע בעקרונות של הכמסה (encapsulation) בתכנות מונחה עצמים.
השחתת זיכרון היא כשמידע בזיכרון מתערבב בטעות.
זה קורה בגלל שגיאה בתוכנה, תקלה בחומרה, או גורם חיצוני.
לפעמים התוכנית קורסת מיד. לפעמים היא ממשיכה ועושה טעות מאוחרת.
דוגמה פשוטה: כתיבה לתא במערך שלא קיים. מערכים ב‑C מתחילים ב‑0.
אם כותבים יותר מדי, המידע יכול לדחוף החוצה ולשנות דברים אחרים.
גלישת חוצץ היא כשמכניסים יותר מדי מידע למקום קטן. הדבר יכול לשבור את המחסנית (stack).
פונקציה שומרת איפה לחזור בסיום שלה. אם זה נדרס, המחשב עלול "לקפוץ" למקום אחר.
כך אפשר להריץ קוד רע על המחשב.
ב‑Java יש בדיקה אוטומטית של גבולות מערך. זה מונע הרבה תקלות.
יש גם כלים כמו Valgrind שעוזרים למצוא טעויות כאלה בזמן בדיקות.
בתוכנות גדולות קשה למצוא את כל הבאגים האלה.
תגובות גולשים