应我们要求第16章要实现能够处理异常的小ABI;上次我们实现了personality函数,使它能够处理有多个着陆垫的函数。现在我们尝试使它识别某个着陆垫是否能处理指定的异常,因此我们可以在catch语句上使用异常说明。
当然,要知道一个着陆垫是否能处理一个异常是困难的任务。你还想要什么吗?目前要克服的最大问题是:
- 首先:我们如何找出一个catch块接受的类型?
- 假设我们可以找出一个catch的类型,我们怎样处理一个catch(…)?
- 对带有多条catch语句的着陆垫,我们怎样知道所有可能的catch类型?
- 考虑下面的例子:
|
|
- 我们不仅要检查着陆垫是否接受当前异常,还要检查它是否接受当前异常的任意父类!
要使我们的工作更轻松,假设我们现在只使用有一个catch的着陆垫,且在我们程序里没有继承。同样,我们怎样找出着陆垫接受的类型?
在.gcc_except_table里有一个地方我们还没分析:活动表。让我们反汇编我们的throw.cpp对象,看那里有什么,就在调用表之后,对我们的“try but don’t catch“函数:
备注:你可以从我的github repo下载完整的源代码。
|
|
看起来不太像,但一定有一个指针(一个众所周知的真实指针)指向具有我们异常名字的某个东西。让我们去到_ZTI14Fake_Exception的定义:
|
|
我们得到了一些非常有趣的结果。你能识别出它吗?这是用于结构体Fake_Exception的std:: type_info!
现在我们知道确实有一种方法可以让指针指向我们异常的某种反射信息。我们能通过编程找到它吗?下次见。