Анализ данных типа info, хранящихся в vtable на c ++ - PullRequest
0 голосов
/ 24 февраля 2019

Пример кода:

class base {
  int val1;

public:
  base(int val): val1(val)
  {
  }

  virtual void basefunc()
  {
    std::cout << "I am in base func";
  }
  virtual ~base()
  {
    std::cout << "I am in base destructor";
  }
};

class derived: public base
{
  int val2;

public:
  derived(int val): base(100), val2(val)
  {
  }
  virtual void basefunc() {
      std::cout << "I am in derived func";
  }
  virtual ~derived()
  {
    std::cout << "I am in derived destructor";
  }
};

int main()
{
    base b = base(10);
    derived d = derived(2);

    base *ptr = &b;
    ptr->basefunc();
    ptr = &d;
    ptr->basefunc();
}

Затем я попытался проверить vtable классов и на выходе получилось:

(gdb) p b._vptr$base[0]
$77 = (int (*)(void)) 0x100006ee0 <base::basefunc()>
(gdb) p b._vptr$base[1]
$78 = (int (*)(void)) 0x100006b30 <base::~base()>
(gdb) p b._vptr$base[2]
$79 = (int (*)(void)) 0x100006f10 <base::~base()>
(gdb) p b._vptr$base[3]
$80 = (int (*)(void)) 0x7fff87fd7fe8
(gdb) p b._vptr$base[4]
$81 = (int (*)(void)) 0x10000eda8 <typeinfo name for base>
(gdb) p b._vptr$base[5]
$82 = (int (*)(void)) 0x0

(gdb) p d._vptr$base[0]
$88 = (int (*)(void)) 0x100006fb0 <derived::basefunc()>
(gdb) p d._vptr$base[1]
$89 = (int (*)(void)) 0x100006b00 <derived::~derived()>
(gdb) p d._vptr$base[2]
$90 = (int (*)(void)) 0x100006fe0 <derived::~derived()>
(gdb) p d._vptr$base[3]
$91 = (int (*)(void)) 0x7fff87fd8058
(gdb) p d._vptr$base[4]
$92 = (int (*)(void)) 0x10000edae <typeinfo name for derived>
(gdb) p d._vptr$base[5]
$93 = (int (*)(void)) 0x10000f248 <typeinfo for base>
(gdb) p d._vptr$base[6]
$94 = (int (*)(void)) 0x0

Вывод относится к clang, скомпилированному с символами GDB.

Я не могу понять данные по 4-му / 5-му индексу.На какую информацию указывают эти 2 индекса и как она используется.Я понимаю, что у каждого компилятора есть выбор для реализации так, как они хотят.

PS: это следующий вопрос Анализ vtable в c ++"

...