MSVC 首先使用指针比较,然后,如果失败,则比较字符串。可以在 VS2012 的 CRT 源码中看到实现:
extern "C" _CRTIMP int __cdecl __TypeMatch(
HandlerType *pCatch, // Type of the 'catch' clause
CatchableType *pCatchable, // Type conversion under consideration
ThrowInfo *pThrow // General information about the thrown
// type.
) {
// First, check for match with ellipsis:
if (HT_IS_TYPE_ELLIPSIS(*pCatch)) {
return TRUE;
}
// Not ellipsis; the basic types match if it's the same record *or* the
// names are identical.
if (HT_PTD(*pCatch) != CT_PTD(*pCatchable)
&& strcmp(HT_NAME(*pCatch), CT_NAME(*pCatchable)) != 0) {
return FALSE;
}
...
Itanium ABI 始终只使用指针比较。它应该与 DLL 一起工作的方式是动态加载程序应确保程序地址空间中的每个异常都有一个 typeinfo 对象的实例。
如果您对异常 RTTI 的实际实现和捕获信息感兴趣,请查看我的OpenRCE 文章(MSVC) 和Recon 2012 演示文稿(GCC,MSVC x64)。