【发布时间】:2015-11-25 19:15:16
【问题描述】:
我正在进行一项实验,并在我从程序中打开的程序和共享库中定义了相同的类,并确保程序在其动态表中没有类型信息对象的条目。然后我从共享库中抛出该类的一个对象,并尝试使用相同的类类型来捕获它。
我预计 linux 和 gcc 上的实现不会捕获异常,因为程序和共享库中两个类的类型信息对象不同,因此只有在运行时进行字符串比较时才有可能匹配损坏的类名。
它仍然匹配,我什至可以对共享库中定义的类进行动态向下转换。谁能解释一下在这种情况下实现是如何工作的?
编辑
根据 Itanium ABI 的规定,观察到的行为似乎不符合标准。我在这里错过了什么?
因此,除了指向不完整类型的直接或间接指针外,等式和不等式运算符在对那些 type_info 对象进行操作时可以写成地址比较:两个 type_info 结构描述相同的类型当且仅当它们是相同的结构 (在同一个地址)。
由于两个 typeinfo 有不同的地址,因此描述的结构代表不同的类型。因此,强制转换应该失败并且不应该捕获异常。
【问题讨论】:
-
dlopen-ed模块中类内的静态成员是否与同源级名称的类内的静态成员合并?
标签: c++ exception-handling shared-libraries typeid itanium-abi