a simple example code as below:
#include <iostream>
class Base
{
public:
virtual void func0() { std::cout << "Base::func0" << std::endl; };
virtual void func1() { std::cout << "Base::func1" << std::endl; };
};
int main()
{
auto instance = Base();
uint64_t* vtableAddr = reinterpret_cast<uint64_t*>(&instance);
uint64_t* pVtable = reinterpret_cast<uint64_t*>(*vtableAddr);
auto func0 = reinterpret_cast<void(*)(Base*)>(*(pVtable + 0));
auto func1 = reinterpret_cast<void(*)(Base*)>(*(pVtable + 1));
func0(&instance);
func1(&instance);
auto func2 = reinterpret_cast<void(*)(Base*)>(*(pVtable + 2)); // exceed the limitation
func2(&instance); // core dump
}
I can get the virtual table address by read the class fisrt 8 bytes(64bits compiler). But I don't know if there is a way to get the max legal offset of pVtable in runtime.
As above example, if I set the offset of pVtable is 2, and invoke the converted function, it will lead to a coredump.
Is any where stored the virtual table "size" for each class?