加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

在Linux / GCC下将NULL指针访问转换为C异常

发布时间:2020-12-14 02:14:35 所属栏目:Linux 来源:网络整理
导读:有没有办法在 Linux下将NULL指针访问转换为C异常?类似于Java中的NullPointerException.我希望以下程序能够成功返回,而不是崩溃(假设编译器在编译期间无法找出此NULL指针访问): class NullPointerException {};void accessNullPointer(char* ptr) { *ptr =
有没有办法在 Linux下将NULL指针访问转换为C异常?类似于Java中的NullPointerException.我希望以下程序能够成功返回,而不是崩溃(假设编译器在编译期间无法找出此NULL指针访问):

class NullPointerException {};

void accessNullPointer(char* ptr) {
    *ptr = 0;
}

int main() {
    try {
        accessNullPointer(0);
    } catch (NullPointerException&) {
        return 1;
    }
    return 0;
}

我不期望任何标准的方法,因为C下的NULL指针访问是未定义的行为,只是想知道如何在x86_64 Linux / GCC下完成它.

我做了一些非常原始的研究,有可能:

>在Linux下访问NULL指针时,将生成SIGSEGV.
>在SIGSEGV处理程序内部,程序的内存和寄存器信息将可用(如果sigaction()用于注册信号处理程序).如果程序被反汇编,也可以使用导致SIGSEGV的指令.
>修改程序的内存和/或注册,并创建/伪造异常实例(可能通过调用低级展开库函数,如_Unwind_RaiseException等)
>最后从信号处理程序返回,希望程序启动一个C堆栈展开过程,就像抛出正常异常一样.

以下是GCC手册页的引用(-fnon-call-exceptions):

Generate code that allows trapping instructions to throw exceptions. Note that this requires platform-specific runtime support that does not exist everywhere. Moreover,it only allows trapping instructions to throw exceptions,i.e. memory references or floating point instructions. It does not allow exceptions to be
thrown from arbitrary signal handlers such as “SIGALRM”.

看来这个“特定于平台的运行时”正是我想要的.任何人都知道这样的Linux / x86_64运行时?或者如果没有这样的运行时已经存在,请给我一些关于如何实现这样的运行时的信息?

我希望该解决方案也适用于多线程程序.

解决方法

不,没有好办法,而且不应该这样做.源代码中的throw语句抛出异常.这对于推理异常安全非常重要:您可以查看代码并查看可以抛出异常的位置,或许更重要的是,您可以查看代码并查看不会抛出异常的位置.如果您做的任何事情都可以抛出异常,那么编写异常安全的代码变得非常困难,而不会使用catch子句使其混乱.微软在早期的C编译器中尝试了这一点:他们在操作系统的结构化异常之上捎带了C异常处理,结果是一场灾难.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读