如何测试实例是否已损坏

How to test if an instance is corrupted?

本文关键字:实例 是否 已损坏 测试 何测试      更新时间:2023-10-16

我在一个现有的程序(c++自动生成代码)中发现了一个bug:

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实例是否有效?

如果指针不是NULL/NIL/NIL或其他"可识别的'不是指针'",那么几乎不可能确定它是否是一个有效的指针。当然,如果它是"几乎为NULL",您可能有机会使用一些不可移植的代码来检查以下内容:

 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和0之间的任意值,则此操作不起作用。2n,其中n为机器位元。它会崩溃,就像你一开始没有检查它一样严重。