Определить смещение виртуальной таблицы определенной виртуальной функции (с использованием Visual C ++) - PullRequest
1 голос
/ 08 апреля 2011

Можно ли проверить смещение vtable конкретной виртуальной функции?

Почему?Я хотел бы иметь возможность обнаруживать непреднамеренные разрывы двоичной совместимости (см. http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C%2B%2B, что я подразумеваю под двоичной совместимостью).

Мне известно о недокументированной и неподдерживаемой технике "/ d1reportSingleClassLayout" (http://blogs.msdn.com/b/vcblog/archive/2007/05/17/diagnosing-hidden-odr-violations-in-visual-c-and-fixing-lnk2022.aspx),, и я планирую использовать эту технику, но я бы также хотел использовать некоторые простые проверки времени компиляции или выполнения, есливозможно.

Ответы [ 3 ]

5 голосов
/ 08 апреля 2011

Вдохновленный ответом Джерри, мне удалось написать эту функцию, которая может делать то же самое для любой сигнатуры функции:

#include <iostream>

struct A
{
    virtual void a() {}
    virtual void b() {}
    virtual void c() {}
};

template <class T>
int SeeBits(T func)
{
    union
    {
        T ptr;
        int i;
    };
    ptr = func;

    return i;
}

int main()
{
    int i = SeeBits(&A::a);
    int j = SeeBits(&A::b);
    int k = SeeBits(&A::c);

    std::cout << i << " " << j << " " << k << std::endl;

    return 0;
}
2 голосов
/ 08 апреля 2011

Это некрасиво, непереносимо, жестоко и т. Д., Но, возможно, что-то в этом общем порядке будет полезно:

#include <iostream>

struct A { 
    virtual void a() {}
    virtual void b() {}
    virtual void c() {}
};

int main() { 
    A a;

    typedef void (A::*ptr)();

    union see_bits { 
        ptr p;
        int i;
    };

    see_bits x, y, z;
    x.p = &A::a;
    y.p = &A::b;
    z.p = &A::c;

    std::cout << x.i << "\n";
    std::cout << y.i << "\n";
    std::cout << z.i << "\n";

    return 0;
}

Чтобы быть немного более переносимым, вам, вероятно, следует использовать массив unsigned char в качестве второго элемента объединения - распечатка этого со смыслом добавит немного больше работы, которую я оставлю вам (в хотя бы пока).

1 голос
/ 08 апреля 2011

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

...