Получение «реального» функция из указателя метода

Учитывая указатель объекта c ++ и совместимый указатель метода на виртуальный метод, существует ли какой-либо удаленно надежный / переносимый способ получить указатель на фактическую концертную функцию, которая будет вызвана?

Случай использования заключается в том, что я хочу запустить указанный указатель с помощью символов отладки, чтобы получить имя типа / функции, которая будет вызвана (без фактического вызова).

Если это возможно только с помощью решений, специфичных для реализации, то я в первую очередь заинтересован в поддержке GCC / LLVM.

2

Решение

LLVM и GCC следуют Itanium C ++ ABI, поэтому вам нужно найти способ прочитать структуры данных, как указано в них. Я дам грубую схему.
Указатель на виртуальный член представлен смещением в таблице виртуальных функций, +1 по некоторым причинам.

class A {
public:
virtual void f();
virtual void g();
};

void (A::*pAg)() = & A::g;
ptrdiff_t offset = *(ptrdiff_t*)(&pAg) - 1;

Указатель на виртуальную таблицу обычно расположен в начале объекта:

A a;
void* vtable = *(void**)&a;

Затем вы смотрите на вычисленное смещение в этой виртуальной таблице и находите фактический указатель на функцию.

void* function = *(void**)(vtable+offset)
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector