האם יש סיבה ש MALLOC יגרום ל

האם יש סיבה ש MALLOC יגרום ל

segmentation fault ? יש לי תוכנית שמשום מה נופלת לאחר פקודת MALLOC, אפילו בלי שהפקודה תצליח להחזיר ערך (אפילו NULL).
 
זו קצת בעיה:

מדובר בתרגיל בית בקומפילציה. כותבים קוד שהוא חלקו C, וחלקו מאקרו שמופעל ע"י ביזון. לכן אני גם לא יכול להריץ דיבאגר נוראמלי. בכל אופן, שורה כזאת אמורה לעשות בעיות?
st = malloc(600);​
ומה שעוד יותר מוזר זה שאם אני אגיד לו להקצות פחות זיכרון, אז הוא לא יפול. וזה לא שהוא נופל בגלל שהmalloc החזיר 0 ואז ניסית לבצע משהו בסגנון של strcpy על st. הוא פשוט נופל באמצע עם segmentation fault.
 

vinney

Well-known member
אני יכול להסתדר עם ביזון...

נשמע מוזר, לדעתי משהו משתבש לך שם בקוד
 

voguemaster

New member
heap corruption

לפעמים יש קוד עם באגים שגורם לטבלאות שה-MEMORY ALLOCATOR מחזיק להיות לא בדיוק תקפות. ואז בפעם הבאה שקוראים ל-MALLOC נניח והוא בודק את הטבלאות שלו הוא מתעופף לו. זו רק דוגמא אחת לבאג כזה. איכשהו הקוד שלך כנראה דפק משהו בטבלאות האלו ואתה צריך למצוא איפה זה קורה, הבעיה היא שאין הרבה דרכים ממש טובות. אני יודע שלספריה הסטנדרטית של לינוקס יש יכולת לאתר בעיות כאלה בזמן ריצה, כשהן קורות. לגבי הפלטפורמה שלך, מי יודע....
 
הבעיה נפתרה.

מסתבר שבמקום אחר בקוד לא הקצאתי מספיק זיכרון ולכן היה BUFFOR OVERRUN. חבל רק שמערכת ההפעלה לא דואגת לכך שהתוכנית תעוף ברגע שהיא מבצעת את הפעולה הבלתי חוקית אלא ממשיכה לרוץ עוד קצת.
 

voguemaster

New member
../images/Emo13.gif

חבל חבל, אבל ככה זה עובד משחר ההיסטוריה ב-C ו ++C. מאז התחדשו כמה דברים כמו WRAPPERS למיניהם שיודעים לצעוק כשקורה משהו מוזר (כמו לדוגמא האופציה הדי בסיסית וטובה של ה-ALLOCATOR בלינוקס), כל מיני אפליקציות שיודעות לזהות OVERRUNים ודברים בסגנון וכד' ועד אפילו שיטות בסיסיות של קומפיילרים וספריות (לדוגמא STLPORT יודעת לבדוק מצבים מוזרים עבור ה-CONTAINERים שלה וכד'). כן, OVERRUN אם הוא לא מעיף את התוכנית עלול בהחלט לגרום ל-HEAP CORRUPTION, שמח שעלית על זה די מהר. בגדול זו הבעיה הגדולה ב-C וב ++C. זה מה יש. לכן עובדים עם ספריות ברמה טיפה יותר גבוהה, זה חוסך באגים בד"כ
.
 

vinney

Well-known member
מצד שני מוסיף Overhead

היתרון העצום של C ו(חלקית)++C הוא בזה שאין את כל הדברים האלה
נכון, זה גם החסרון הכי גדול
 

voguemaster

New member
מה מוסיף OVERHEAD ?

באיזה FEATURE יש תוספת של OVERHEAD ? לא נראה לי שציינתי אחד כזה..
 

vinney

Well-known member
כל wrapper מוסיף

מעט ככל שיהיה - שום דבר לא בא בחינם
 

voguemaster

New member
כן

אבל אלו כלים למטרות DEBUG, למציאת באגים. לדוגמא ב-STLPORT יש בדיקות וכד' וכל מיני ASSERTים שמונעים ממך לעשות טעויות אבל ב-RELEASE הם לא מקומפלים לקוד בכלל. שלא לדבר על כלים כמו BC וכד' שהם בכלל MEMORY DEBUGGERS ולא קשורים לריצה של האפליקציה שלך כשהיא standalone.
 

zagzagzag

New member
אתה יכול לפרט קצת

על האופציה הדי בסיסית של ה-allocator בלינוקס? מה היא אמורה למנוע?
 

voguemaster

New member
כמו שאמרתי קודם

כשאתה כותב עם הספריה הסטנדרטית של C תחת לינוקס יש לך אפשרות להריץ את ה-allocator (זה שמקצה לך זיכרון) בתצורת DEBUG. כלומר, התוכנית שלך בעצם רצה באותה צורה בלי שום שינויים, מצד שני הספריה מבצעת בדיקות תקינות לטבלאות ההקצאה שלה בכל קריאה ל-malloc ו-free (שאגב נקראות באופן פנימי ע"י הרבה פונק' ספריה כגון fopen ו-fclose ועוד המוון..). אם פעולה מסוימת גורמת להשחתה של מבני הזיכרון של malloc הספריה תעצור את התוכנית בנק' הנתונה ואז אתה יכול לבצע ניתוח של מה שקרה ולראות מה עשית לא בסדר
. את האופציה הזו מפעילים ע"י משתנה סביבה שנקרא _MALLOC_CHECK. הנה קישור ל-man page של MALLOC שמתאר את הערכים (בעיקרון 0 זה שימוש רגיל, 1 מדפיס הודעה דיאגנוסטית ו-2 עוצר את התוכנית ע"י abort בצורה מיידית). ד"א למי שתוהה לגבי ביצועים, יש שני מימושים של הספריה בהקשר הזה - אחד לשימוש רגיל והשני לשימוש DEBUG.
 
למעלה