检测特定虚函数的虚值表偏移量(使用Visual c++)

Detect the the vtable offset of a specific virtual function (using Visual C++)

本文关键字:使用 Visual 偏移量 c++ 函数 检测      更新时间:2023-10-16

可以检查特定虚函数的虚表偏移量吗?

为什么?我希望能够检测无意的二进制兼容性中断(请参阅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)这一未被记录且不受支持的技术,我计划使用这种技术,但如果可能的话,我还想使用一些简单的编译时或运行时检查。

受Jerry回答的启发,我设法编写了这个函数,它可以对任何函数签名做同样的事情:

#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;
}

它是丑陋的,不可移植的,粗糙的,等等,但也许这个一般顺序的东西将是有用的:

#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数组作为联合的第二个元素——以一种有意义的方式将其打印出来会增加一些工作,我将把这些工作留给您(至少现在)。

这里有一个很好的例子。请注意,您将无法检索函数名,只能检索地址/偏移量。