在LinuxGCC下将NULL指针访问转换为C异常

在LinuxGCC下将NULL指针访问转换为C异常,第1张

概述有没有办法在 Linux下将NULL指针访问转换为C异常?类似于Java中的NullPointerException.我希望以下程序能够成功返回,而不是崩溃(假设编译器在编译期间无法找出此NULL指针访问): class NullPointerException {};void accessNullPointer(char* ptr) { *ptr = 0;}int main() 有没有办法在 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异常处理,结果是一场灾难. 总结

以上是内存溢出为你收集整理的在Linux / GCC下将NULL指针访问转换为C异常全部内容,希望文章能够帮你解决在Linux / GCC下将NULL指针访问转换为C异常所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1032567.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存