【c++逆向 - 4】GCC C++异常处理机制

异常机制

c++ 异常是对程序运行过程中发生的异常情况的一种响应,异常提供了将控制权从程序的一个部分转移到另一个部分,异常处理由三部分组成:

  • throw 抛出异常
  • catch 捕获异常
  • try 异常检测范围

主要框架如下:

try {
	if (cond)
		throw ...;
} catch(...) {

} catch(...) {

}...

注意:执行 throw 语句类似与执行 return 返回语句,它会终止函数的执行,但是 throw 并不是把控制权交给调用函数,而是沿函数调用序列进行回退,直到找到包含 try 块的函数并能成功匹配异常。
啥意思呢?考虑如下代码:

#include 

using std::cin;
using std::cout;
using std::endl;

int add(int a, int b)
{
        if (!(a + b))
                throw "Note: a is allowed to equal to -b";
        cout << "add end\n";
        return a + b;
}

int func(int a, int b)
{
        int c;
        try {
                c = add(a, b);
        } catch (char ch) {
                cout << "func catch\n";
        }
        cout << "func end\n";
        return a * c;
}

int main()
{
        int a, b, c;
        cin >> a >> b;
        try {
                c = func(a, b);
                cout << c << endl;
        } catch (const char* s) {
                cout << s << endl;
        }
        cout << "END\n";
        return 0;
}

这里调用关系为:main -> func -> add,输入 a = 1, b = -1,最后会在 add 函数中触发异常,这时 throw 会抛出异常,这时会沿调用路径回溯寻找 try - catch 捕获异常,所以这里触发异常后,控制权就直接回到了 main 函数中,所以 cout << "func end\n"; 不会执行:输出结果如下

xiaozaya@pwn:~/rubbish/cpp$ ./a.out
1 -1
Note: a is allowed to equal to -b
END

不同的操作系统,不同的编译器,异常处理的底层实现是不同的,这里主要分析下 linux gcc 下的原理实现,这里找到了几篇文章,所以就不打算写垃圾了:
c++ 异常处理(1)
c++ 异常处理(2)
CPP 异常处理机制初探
C++异常机制的实现方式和开销分析

你可能感兴趣的:(C++逆向,c++,异常处理)