2

この方法で、既存のプログラム (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 ) {を入力すると、呼び出しを実行しようとするとプログラムが失敗します。elseObj->StringExtract

Objインスタンスが有効かどうかをテストするにはどうすればよいですか?

4

1 に答える 1

2

ポインターが 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;

ただし、obj0...2 nの間の完全に任意の値である場合、これは機能しません。ここで、n はマシンのビット数です。そもそもチェックしなかったかのように、ひどくクラッシュします。

于 2013-04-10T12:59:45.277 に答える