3

我正在进行一项实验,并在我从程序中打开的程序和共享库中定义了相同的类,并确保程序在其动态表中没有类型信息对象的条目。然后我从共享库中抛出该类的一个对象,并尝试使用相同的类类型来捕获它。

我预计 linux 和 gcc 上的实现不会捕获异常,因为程序和共享库中两个类的类型信息对象不同,因此只有在运行时对损坏的类进行字符串比较时,才有可能匹配名字。

它仍然匹配,我什至可以对共享库中定义的类进行动态向下转换。谁能解释一下在这种情况下实现是如何工作的,好吗?

编辑

根据 Itanium ABI 的陈述,观察到的行为似乎不符合标准。我在这里想念什么?

因此,除了指向不完整类型的直接或间接指针外,等式和不等式运算符在对这些 type_info 对象进行操作时可以写成地址比较:两个 type_info 结构描述相同的类型当且仅当它们是相同的结构(同时地址)。

由于这两个 typeinfo 有不同的地址,因此所描述的结构代表不同的类型。因此,强制转换应该失败并且不应该捕获异常。

4

2 回答 2

1

Itanium ABI 明确声明要按损坏的名称比较类的 type_info 对象,这确实是您问题中假设的实现。

https://refspecs.linuxbase.org/cxxabi-1.86.html#rtti

我想这里的基本原理是完全支持您观察到的行为。

typeinfo 描述符也被定义为具有“模糊链接”,这很可爱。但是,使用的定义要求将它们放在 COMDAT 组中。COMDAT 组需要由链接器进行重复数据删除,至少作为静态链接的一部分。我目前无法确定是否也需要对它们进行重复数据删除以进行动态链接,但这似乎是合乎逻辑的。

所以总而言之,你的问题的答案是,“它已经处理了,因为 ABI 作者预见到了这种情况并确保它得到了处理”。

于 2015-11-25T22:06:22.760 回答
-1

在程序和我从程序中打开的共享库中定义了相同的类- 恭喜您违反了一个定义规则。在未定义行为的土地上,任何事情都可能发生,你应该知道。

于 2015-11-25T19:22:55.447 回答