2013-04-10 31 views
1

我發現了一個bug在現有的程序(C++自動生成的代碼)在該方法中:如何測試一個實例是否損壞?

void _CallStyle _WFObjectVarAsStringExtractEFAgent::LoadValue(Pointer __VarAddress, aType theVarType) { 
    absolute(tpPointer, VarAddress, __VarAddress); 
    aLightObject Obj = nil; 

    Obj = aLightObject(*VarAddress); 

    if (Obj == Nil) { 

     this->SetValue(""); 
    } else { 
     this->SetValue(Obj->StringExtract(this->ExtractKind, this->ExtractParam, 0)); 
    } 
    this->Lock(); 
    if (Obj == Nil) { 
     this->Disable(); 
    } else { 
     this->Enable(); 
    } 
} 

有時行Obj = aLightObject(*VarAddress);返回不是一個有效aLightObject實例既不Nil(但一個損壞aLightObject實例)。

因此,在下面的行中if (Obj == Nil) {我們輸入else區塊,並且在嘗試執行Obj->StringExtract調用時程序失敗。

我該如何測試Obj實例是否有效?

+7

你可能會更好地跟蹤並消除腐敗,而不是試圖處理它 – 2013-04-10 12:49:04

+2

那麼這完全取決於「有效」對你的意義,不是嗎?除了「在標準允許的狀態」之外,沒有「有效」的普遍概念。 – 2013-04-10 12:49:16

+2

編寫正確的代碼,以便您的對象始終「有效」(無論如何)。 – 2013-04-10 12:50:33

回答

1

如果指針不是NULL/NIL/NIL或其他「可識別」不是指針'「,那麼確定它是否是有效指針幾乎是不可能的。當然,如果是「近空」,你或許可以有一些不可移植的代碼的機會,檢查沿着線的東西:

ptrdiff_t diff = NULL - reinterpret_cast<char *>(ptr); 
if (diff < -100000) cout << "Bad pointer" << ptr << endl; 

你也可以做一個檢查,如果對象是一個有效的指針,包含的東西你知道它應該是什麼。典型的做法是有一個「魔術」,例如

class myobject 
{ 
    public: 
     int magic; 
    ... 
     myobject() : magic(1234567)  // Make sure it's different for each type of object. 
     { 
     ... 
     } 
    .... 
}; 

... 
    if (obj->magic != 1234567) cout << "Object is not right type..." << endl; 

然而,這不起作用如果obj是0之間只是一些完全任意值... 2 ñ其中n是機器的位數。它會像最初沒有檢查過的那樣嚴重崩潰。

相關問題