הבאג המוזר בעולם - cpp

James Devlin

New member
הבאג המוזר בעולם - cpp

יש לי באג מאוד מוזר בקוד הבא:

double val1 = gamma * fabs((double)j+pOffset[plane][k][offset]);

pRangeTerm[plane][k][offset].data()[j+winsize]=val1;

double val2 = pRangeTerm[plane][k][offset].data()[j+winsize];


כשעוברים עם debugger, הערך של val1 הוא 0.05 אבל הערך של val2 הוא 0, כאילו שלא הכניסו לשם שום ערך. זה משתחזר בכל פעם! איך זה יכול להיות?

הטיפוס של pRangeTerm הוא PixelBuffer1D<T_message>** pRangeTerm[2]; zzz כאשר T_message זה double. אני אעתיק לכאן את ההגדרה של PixelBuffer1D:

template <class T>
class PixelBuffer1D
{
private:
short int nDim;
T* pData;
public:
PixelBuffer1D(void)
{
nDim=0;
pData=NULL;
}
PixelBuffer1D(int ndims)
{
allocate(ndims);
}
void allocate(int ndims)
{
nDim=ndims;
}
~PixelBuffer1D()
{
nDim=0;
pData=NULL;
}
inline const T operator [](int index) const
{
return pData[index];
}
inline T& operator [](int index)
{
return pData[index];
}
T*& data(){return pData;};
const T* data() const{return pData;};
int nElements() const{return nDim;};
};



מה אני מפספס כאן? איך זה יכול להיות ששמים ערך במשתנה והוא נשאר אפס?


תודה מראש!!
 
ובכן

בהנחה שמה שכתבת זה הקוד המלא של PixelBuffer1D (או לפחות שהפונקציות שהראית), אין שום מקום שבו מכניסים כתובת שאינה NULL ל-pData. אם האובייקט נוצר ע"י בנאי ברירת המחדל, pData יהיה NULL, ואם לא, הוא יהיה זבל.
במקרה כזה, כתיבה ל-*pdata וקריאה משם זה undefined behavior, ותוצאות כמו שלך חוקיות לגמרי.
 

James Devlin

New member
תודה על ההערה.

האמת שיש שורת קוד שבה קוראים לפונ' ייעודית למבנה הנתונים הזה שמקצה זכרון, אבל אולי שווה לבדוק אם ההקצאה באמת מצליחה ואין בעיות בפונ' הזאת.

תודה!
 

James Devlin

New member
טוב, מסתבר שהזכרון מוקצה וזה לא Null,

אבל הוא מוקצה כint... מכניסים אל המערך איברים בין 0 ל1, אז הוא מעגל אותם לאפס. זה הבאג:)
 

selalerer

New member
איך אפשר לצפות שלא יהיה באג בקוד כזה?

למה ליצור שורה של קוד כלכך עמוסה? ועוד יותר מאחת כזו?

תפריד כל שורה כזו לאיזה 10 שורות בערך. תאתחל ערכים (ל-NULL למשל). תוסיף בדיקות תקינות בין השורות, למשל שמצביע הוא לא NULL ושלמערך או vector יש מספיק גודל בכדי לפנות לאיבר ה-X שלו.

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

James Devlin

New member
אני מסכים. הקוד הזה באמת מזעזע,

וזה עוד אחד החלקים היותר סבירים.

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

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

selalerer

New member
אני מניח שאפשר לנסח את מה שהשורה הזו עושה

במילים. חבר את המילים האלו לשם של מטודה ושים את הקוד בתוך מטודה. כך הקוד יהיה יותר קריא.
 
למעלה