c++ - 访问在 C 中保存 C++ 对象的空指针的内容

标签 c++ c instrumentation

我正在使用 DynamoRIO 进行二进制检测在 C++ 程序上使用 C 客户端虽然您可能不需要了解 DynamoRIO 来回答我的问题。目前我正在包装一个具有签名的函数:

virtual void foo(Klass& s)

然后在包装函数中,我可以将此函数调用 (Klass& s) 的参数获取到一个空指针 (void *arg1)。我需要使用此参数(即访问字段、调用方法),但是我无法将其转换为适当的指针,因为 Klass 是一个 C++ 类,而我正在使用的客户端位于纯C。

当我尝试通过将 void* 转换为 size_t 来打印其内容时,例如:

printf("%zd\n", (size_t)arg1);

它给了我一个 8 位数字,例如 25102856,我猜这是一个内存地址。

我的问题是如何在我的程序中访问这个对象?

请询问您需要的所有信息,我乐于接受所有想法。

最佳答案

要使其工作 - 为 getter 和 setter 定义 C 风格的包装器,如本例所示:

为了你的类(class)

class Klass {
public:
  int getA() const;
  void setA(int);
  virtua int getB() const;
};

定义包装此类的 C 结构:

typedef int (*GetInt)(void*);
typedef void (*SetInt)(void*,int);
// and similar for other types


struct KlassCInterface {
  void* object;
  GetInt getA;
  SetInt setA;
  GetInt getB;
};

extern "C" int getA(void* obj)
{
    return static_cast<Klass*>(klassObj)->getA();
}
...
KlassCInterface* getCInterface(Klass* obj)
{
   // malloc just in case your client want to use free()
   KlassCInterface* retVal = (KlassCInterface*)malloc(sizeof(KlassCInterface));
   retVal->object = obj;
   retVal->getA = &getA;
   ...
   return retVal;     
}

当您传递 void* 数据时,将其作为 C 接口(interface)结构传递:

Klass* obj = new Klass(...);
KlassCInterface* objC = getCInterface(obj);

registerData(objC);

在您的 C 代码中 - 使用此 C 接口(interface):

void doSthWihtKlass(void* data)
{
   KlassCInterface* objC  = (KlassCInterface*)data;
   printf("%d\n", objC->getA(objC->object));
}

关于c++ - 访问在 C 中保存 C++ 对象的空指针的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12919801/

相关文章:

Android Instrumentation 测试已取消但在设备上运行

c++ - 使用 c++ 为大至 1000 x 1000 的矩阵实现 8-连通性的连通分量标记

c++ - 虚拟多重继承 - 最终覆盖

c - 如何在有两个圆圈的矩形中找到空白区域?

java - 检测类时,插入的堆栈帧的偏移量与现有堆栈帧重叠

java - 计算对象的内存占用,需要说明

c++ - 如何从 CV_8UC4 矩阵中获取值

c++ - 如何使用 C++ 解析 HTTP 响应

c - 定义全局变量,它将被多个 .c 文件使用

python - 嵌入 C 时维护 Python 对象