【发布时间】:2011-03-18 12:14:16
【问题描述】:
如果出现 Segmentation Fault 错误,是否可以恢复 C 程序的正常执行流程?
struct A {
int x;
};
A* a = 0;
a->x = 123; // this is where segmentation violation occurs
// after handling the error I want to get back here:
printf("normal execution");
// the rest of my source code....
我想要一种类似于 Java、C# 等中存在的 NullPointerException 的机制。
注意:请不要告诉我 C++ 中有异常处理机制,因为我知道,不要告诉我应该在赋值之前检查每个指针等。
我真正想要实现的是回到上面示例中的正常执行流程。我知道可以使用 POSIX 信号执行一些操作。它应该是什么样子?其他想法?
【问题讨论】:
-
遇到“空指针异常”后,您希望将控制权返回到哪里?
-
最好将控制权返回到导致 sigsegv 的指令之后的第一条指令,但任何其他“安全”的地方都值得赞赏。
-
SIGSEGV 后没有“正常执行流程”。错误可能发生在
if (*p > 12)之类的地方,并且由于 *p 未定义,您的程序将继续运行,就像您编写了if (random() & 1 == 0) -
@Marc,你不应该这样做的原因是你真的不知道你的程序在段错误之后的状态是什么。您的堆栈可能已损坏;您的堆可能已损坏;您的全局变量可能会被压缩;你的指令指针可能在梦幻岛;您的安全数据可能在互联网上传播;你的 CPU 可能着火了。你会后悔在一个段错误之后继续尝试,好像什么都没发生一样。处理调用有缺陷的第三方代码的正确方法是生成一个新进程来调用它——需要做更多的工作,但唯一可靠的是远程。
-
我猜你希望“你不能重写的函数”中的错误对你自己的代码影响很小或没有影响。这种推理的问题在于,正如你所说,你没有消息来源。据您所知,它们可能正在您自己分配的内存中写入,擦除您自己的数据甚至您的堆栈。如果发生这种情况,即使使用您自己的处理程序也不会将您的进程内存恢复到正确的状态。因此,忽略 他们的 代码产生的分段错误只会延迟到从 your 代码引发的下一个错误......我很高兴我没有遇到你的情况...
标签: c exception-handling signals segmentation-fault