פורסם 2009 ביוני 616 שנים קשה לנחש מה הבעיה סתם ככה.אתה יכול להעלות לכאן את הקוד?באיזה חבילות התכנית שלך משתמשת?
פורסם 2009 ביוני 616 שנים שאתה מריץ דרך ויז'ואל זה מריץ במצב דיבאג שמאפס את כל הנתונים לפני שהתוכנית מתחילה.הרצה רגילה לא עושה את זה, לפחות לא בסי. תבדוק אולי ברח לך איזה משתנה שלא איפסת ואתה מתחיל לעבוד איתו. משהו כמו משנה שנכנס למערך ובטעות יוצא ממרחב הזיכרון שלך ויוצר סגמנטיישן פולט
פורסם 2009 ביוני 616 שנים מחבר יש המון שורות קוד מחולקות לקבצים שוניםובעצם, במחשבה שנייה, קשה לי להאמין שהבעייה בקוד - עובדה שדרך הDebugger אין אפילו שגיאה אחתיש רק הרבה אזהרות על strcpy וstrcat...ןמה זאת אומרת באיזה חבילות? הכוונה לקבצים שעושים להם include?אממ, איזה נתונים בדיוק הדיבאגר מאפס? P:
פורסם 2009 ביוני 616 שנים הוא מזהיר לגבי strcpy ו-strcat כי אלה פונקציות לא בטוחות (ייתכן שבמחרוזת שאתה מעתיק לתוכה יש פחות מקום מאשר אורך המחרוזת שאתה מנסה להעתיק). מיקרוסופט מעודדים להשתמש בגרסאות שלהם של הפונקציות, בשם strcpy_s ו-strcat_s.בכל מקרה, תנסה לוודא כמה דברים בתכנית:האם יש שימוש במשתנים לא מאותחלים?האם יש גישה למצביעים שלא אותחלו, או לחילופין ניגשים למצביעים שמצביעים לאובייקטים שכבר לא קיימים?האם יש buffer overflow (גישה למערך, במקום שעובר את גודל המערך)? צריך לבדוק את זה בפרט גם עבור מחרוזות.בד"כ כשאתה מריץ את התוכנה מתוך הדיבאגר, הוא מצליח למנוע (בד"כ לא בכוונה) חלק מהשגיאות האלה. לדוגמה, אם יש buffer overflow, הדיבאגר יגרום לכך שהיא לא תעשה נזק (במקום להקריס את התכנית).לגבי חבילות, התכוונתי לממש חבילות (libraries). אם אתה לא יודע מה זה, אני מניח שאתה לא משתמש בזה...במקרה הכי גרוע, כווץ את הקוד שלך ותעלה לכאן.
פורסם 2009 ביוני 616 שנים מחבר האם יש שימוש במשתנים לא מאותחלים?עכשיו עברתי על הכל, אין משתנה אחד שאני משתמש בערך שלו לפני שהושם לו ערך כלשהוהאם יש גישה למצביעים שלא אותחלו, או לחילופין ניגשים למצביעים שמצביעים לאובייקטים שכבר לא קיימים?לא, גם בדקתי, דאגתי למצב שבו המצביע עוד לא אותחל.האם יש buffer overflow (גישה למערך, במקום שעובר את גודל המערך)? צריך לבדוק את זה בפרט גם עבור מחרוזות.בד"כ כשאתה מריץ את התוכנה מתוך הדיבאגר, הוא מצליח למנוע (בד"כ לא בכוונה) חלק מהשגיאות האלה. לדוגמה, אם יש buffer overflow, הדיבאגר יגרום לכך שהיא לא תעשה נזק (במקום להקריס את התכנית).אני בספק, במקרים כאלה זה פשוט כותב לי "buffer overflow"לגבי חבילות, התכוונתי לממש חבילות (libraries). אם אתה לא יודע מה זה, אני מניח שאתה לא משתמש בזה...במקרה הכי גרוע, כווץ את הקוד שלך ותעלה לכאן.אה, כן, אני מממש כמה ספריות (זה השם שבו אני מכיר את זה)קוראים לזה פרסר, תכלס זה אסמבלר אבל בגלל איזו בעייה שאני לא אטריח אתכם בה הייתי חייב לקרוא לזה פרסריש שם אפילו בתיקיית Debug תוכנית אסמבלי שזה אמור להפוך לשפת מכונה (וזה בהחלט עובד דרך הDebugger)זה אסמבלי של מחשב מאוד מאוד פשוט, יש בערך 4 פקודות שונות[attachment deleted by admin]
פורסם 2009 ביוני 616 שנים אני בספק, במקרים כאלה זה פשוט כותב לי "buffer overflow"אה, כן, אני מממש כמה ספריות (זה השם שבו אני מכיר את זה)לפי תאור הבעיה אני די בטוח שיש לך buffer overflow או דריסת זכרון מסוג אחר. לא תמיד הדיבאגר יכול לתפוס מקרים של buffer overflow ובטח שלא דריסות זכרון. יתכן שיש לך שחרור כפול של זכרון (כלומר אותו מצביע שוחרר פעמיים), או פשוט מצביע כלשהו שמכיל זבל.האם בדקת את כל הפוינטרים? אני מציע לך לעשות כך:1) תדפיס את כל המצביעים שאתה מקצה ומשחרר. זה כולל גם הקצאות עם פונקציות כגון strdup2) תמיד תבדוק כל מצביע בדיוק לפני שאתה משתמש בו.3) לאחר שאתה משחרר מצביע, תאפס אותו.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.