我只是偶然发现了segvcatch这将包段错误和浮点错误到适当的例外库。
使用这个库安全的,如果我想补充的前提下,所有的段错误捕获只会是空指针访问(即,它可以完全之前段错误都搞砸了存储阵列没有溢出或无效的指针,导致不确定的行为呢)? 将程序仍然有受凉nullptr段错误之后定义语义? 怎么样浮点错误? 难道他们表现得更好/不同?
旁注:请没有评论指出,任何产生段错误的程序是无论如何形成不良,应调试/固定。 我知道,我同意。 不过,我感兴趣的这个问题。
我只是偶然发现了segvcatch这将包段错误和浮点错误到适当的例外库。
使用这个库安全的,如果我想补充的前提下,所有的段错误捕获只会是空指针访问(即,它可以完全之前段错误都搞砸了存储阵列没有溢出或无效的指针,导致不确定的行为呢)? 将程序仍然有受凉nullptr段错误之后定义语义? 怎么样浮点错误? 难道他们表现得更好/不同?
旁注:请没有评论指出,任何产生段错误的程序是无论如何形成不良,应调试/固定。 我知道,我同意。 不过,我感兴趣的这个问题。
不安全。
信号处理程序很简单,他们是完全错误的。 这里的SEGV处理程序:
void default_segv()
{
throw std::runtime_error("Segmentation fault");
}
这是相当非法的,至少在POSIX。 从信号处理程序中抛出异常是一个非常,非常糟糕的主意。
附录
那么,为什么这是一个坏主意?
随着SIGALRM,它比一个坏主意差; 这是不确定的行为,因为警报是异步的。 随着SIGSEGV和SIGBUS这是一个非常糟糕的想法。 与其他信号,它仅仅是一个坏主意。 也许工作,有时。 其他时候,它可能不会。 结果可能是灾难性的比较时,魔术不起作用。
我会看SEGV第一。 分割侵犯和总线错误的一个常见原因是砸堆栈。 没有堆放松,如果这是信号的原因。 该throw
将尝试展开栈,这将提高其他SEGV。 怎么办? 在我的电脑,这是一个灾难。
不管信号,信号处理器中投不相对于RAII安全的,因为free()
因此delete
)是不是安全的处理程序的范围内调用。 还有的认为是不安全的信号处理程序的范围内调用函数的整体转换。 一切之后发生的throw
在处理从信号处理的范围内进行,因为throw
不从处理程序返回。 该throw
绕过回报。
这些不安全的调用和不安全平仓意味着一个新的信号,而仍处理旧的信号得到提升。 这种递归的信号是非常有问题的。 在我的电脑,例如,信号被更改为SIGSTOP。 该程序不会退出,但不下降的核心。 它只是挂在那儿,永久冻结,直到我要么杀-9,或重新启动计算机。