עבור לתוכן

לא משנה.

Featured Replies

פורסם

קשה לנחש מה הבעיה סתם ככה.

אתה יכול להעלות לכאן את הקוד?

באיזה חבילות התכנית שלך משתמשת?

פורסם

שאתה מריץ דרך ויז'ואל זה מריץ במצב דיבאג שמאפס את כל הנתונים לפני שהתוכנית מתחילה.

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

פורסם
  • מחבר

יש המון שורות קוד מחולקות לקבצים שונים

ובעצם, במחשבה שנייה, קשה לי להאמין שהבעייה בקוד - עובדה שדרך הDebugger אין אפילו שגיאה אחת

יש רק הרבה אזהרות על strcpy וstrcat...

ןמה זאת אומרת באיזה חבילות? הכוונה לקבצים שעושים להם include?

אממ, איזה נתונים בדיוק הדיבאגר מאפס? P:

פורסם

הוא מזהיר לגבי strcpy ו-strcat כי אלה פונקציות לא בטוחות (ייתכן שבמחרוזת שאתה מעתיק לתוכה יש פחות מקום מאשר אורך המחרוזת שאתה מנסה להעתיק). מיקרוסופט מעודדים להשתמש בגרסאות שלהם של הפונקציות, בשם strcpy_s ו-strcat_s.

בכל מקרה, תנסה לוודא כמה דברים בתכנית:

האם יש שימוש במשתנים לא מאותחלים?

האם יש גישה למצביעים שלא אותחלו, או לחילופין ניגשים למצביעים שמצביעים לאובייקטים שכבר לא קיימים?

האם יש buffer overflow (גישה למערך, במקום שעובר את גודל המערך)? צריך לבדוק את זה בפרט גם עבור מחרוזות.

בד"כ כשאתה מריץ את התוכנה מתוך הדיבאגר, הוא מצליח למנוע (בד"כ לא בכוונה) חלק מהשגיאות האלה. לדוגמה, אם יש buffer overflow, הדיבאגר יגרום לכך שהיא לא תעשה נזק (במקום להקריס את התכנית).

לגבי חבילות, התכוונתי לממש חבילות (libraries). אם אתה לא יודע מה זה, אני מניח שאתה לא משתמש בזה...

במקרה הכי גרוע, כווץ את הקוד שלך ותעלה לכאן.

פורסם
  • מחבר

האם יש שימוש במשתנים לא מאותחלים?

עכשיו עברתי על הכל, אין משתנה אחד שאני משתמש בערך שלו לפני שהושם לו ערך כלשהו

האם יש גישה למצביעים שלא אותחלו, או לחילופין ניגשים למצביעים שמצביעים לאובייקטים שכבר לא קיימים?

לא, גם בדקתי, דאגתי למצב שבו המצביע עוד לא אותחל.

האם יש buffer overflow (גישה למערך, במקום שעובר את גודל המערך)? צריך לבדוק את זה בפרט גם עבור מחרוזות.

בד"כ כשאתה מריץ את התוכנה מתוך הדיבאגר, הוא מצליח למנוע (בד"כ לא בכוונה) חלק מהשגיאות האלה. לדוגמה, אם יש buffer overflow, הדיבאגר יגרום לכך שהיא לא תעשה נזק (במקום להקריס את התכנית).

אני בספק, במקרים כאלה זה פשוט כותב לי "buffer overflow"

לגבי חבילות, התכוונתי לממש חבילות (libraries). אם אתה לא יודע מה זה, אני מניח שאתה לא משתמש בזה...

במקרה הכי גרוע, כווץ את הקוד שלך ותעלה לכאן.

אה, כן, אני מממש כמה ספריות (זה השם שבו אני מכיר את זה)

קוראים לזה פרסר, תכלס זה אסמבלר אבל בגלל איזו בעייה שאני לא אטריח אתכם בה הייתי חייב לקרוא לזה פרסר

יש שם אפילו בתיקיית Debug תוכנית אסמבלי שזה אמור להפוך לשפת מכונה (וזה בהחלט עובד דרך הDebugger)

זה אסמבלי של מחשב מאוד מאוד פשוט, יש בערך 4 פקודות שונות

[attachment deleted by admin]

פורסם

אני בספק, במקרים כאלה זה פשוט כותב לי "buffer overflow"אה, כן, אני מממש כמה ספריות (זה השם שבו אני מכיר את זה)

לפי תאור הבעיה אני די בטוח שיש לך buffer overflow או דריסת זכרון מסוג אחר. לא תמיד הדיבאגר יכול לתפוס מקרים של buffer overflow ובטח שלא דריסות זכרון. יתכן שיש לך שחרור כפול של זכרון (כלומר אותו מצביע שוחרר פעמיים), או פשוט מצביע כלשהו שמכיל זבל.

האם בדקת את כל הפוינטרים? אני מציע לך לעשות כך:

1) תדפיס את כל המצביעים שאתה מקצה ומשחרר. זה כולל גם הקצאות עם פונקציות כגון strdup

2) תמיד תבדוק כל מצביע בדיוק לפני שאתה משתמש בו.

3) לאחר שאתה משחרר מצביע, תאפס אותו.

פורסם
  • מחבר

עריכה: לא משנה אנשים, תודה רבה על הנסיון לעזור, אבל אני ויתרתי

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים