如何测试实例是否已损坏
How to test if an instance is corrupted?
我在一个现有的程序(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为机器位元。它会崩溃,就像你一开始没有检查它一样严重。
相关文章:
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 检查某些类型是否是模板类 std::optional 的实例化
- 如何检查类实例向量的索引是否为空
- 检查类是否在方法中实例化
- 实例化模板时,我是否必须显式显示参数包中的类型?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 是否可以检查给定exception_ptr实例是否拥有某种类型的异常?
- 使用模板检查我的类的两个实例是否相等
- 将新放置到缓冲区后,缓冲区和实例是否具有相同的 void* 地址?
- 创建 QQuickItem 子类的实例是否有问题,我不打算渲染或添加到 QML 树中的实例?
- 实例是否应该使用资源库/获取器来访问自己的私有数据成员
- C++模板能否确定所声明/定义的实例是否为常量
- 类的实例是否仍在同一进程内的线程之间共享相同的静态成员
- 如何从成员函数中检测实例是否为常量
- 检查实例是否存在,并在Singleton getInstance();中返回引用;
- 如何检查我的类的两个实例是否相等
- 检查程序的另一个实例是否已经运行
- 释放类的实例是否也会释放由其对象/方法动态分配的内存?
- 如何测试实例是否已损坏
- 我想检查类实例是否已经存储在std::vector中