检测特定虚函数的虚值表偏移量(使用Visual c++)
Detect the the vtable offset of a specific virtual function (using Visual C++)
可以检查特定虚函数的虚表偏移量吗?
为什么?我希望能够检测无意的二进制兼容性中断(请参阅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数组作为联合的第二个元素——以一种有意义的方式将其打印出来会增加一些工作,我将把这些工作留给您(至少现在)。
这里有一个很好的例子。请注意,您将无法检索函数名,只能检索地址/偏移量。
相关文章:
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 使用visual studio 2019正确设置tinycc,找不到库libtcc1-32.a
- 在Windows 10上使用Visual Studio 2019构建的Tesseract API c ++程序在Wind
- 使用 Visual Studio 2019 构建 Hello World wxwidgets 应用程序时出错
- 如何在调试中使用Visual Studio正确编译WebRTC?
- 带有自动参数的函数使用 GCC 编译,但不使用 Visual C++ 编译
- C++ 使用 Visual Studio 2020 不能使用 .length()
- 使用Visual Studio在虚幻引擎中创建一个新的类c ++给了我太多的错误
- 使用 Visual Studio 2019 编译 Unicode
- C++20 使用 Visual Studio 编译模块:不编译或导入 ixx 文件
- 如何使用Visual Studio 2008将字符串映射到函数?
- 使用Visual Studio 2012编译时,此代码会给我错误,但是使用代码块就可以了
- 使用 Visual Studio C++ 在控制台中控制字体和字符集
- 使用 Visual Studio 代码读取 C++ 中的输入流时出错
- 需要有关使用 Visual Studio 17 将 QT 桌面应用程序打包为 AppX 格式的指导
- 在Windows 10上使用Visual Studio 2019的Boost 1.71.0库出现错误
- 试图弄清楚我需要做哪些更改才能使代码正常工作.使用Visual Studio
- 使用Visual Studio进行跨平台C++开发
- 使用Visual Studio code Ubuntu调试c++代码
- 如何在Ubuntu中使用Visual Studio代码编译C++代码