相关疑难解决方法(0)

为什么分段错误不可恢复?

我之前的问题之后,大多数评论都说“不要这样做,你处于一种不确定的状态,你必须杀死一切并重新开始”。还有一个“安全”的解决方法

我不明白的是为什么分段错误本质上是不可恢复的。

写入受保护内存的时刻被捕获 - 否则,将SIGSEGV不会被发送。

如果可以捕获写入受保护内存的时刻,我不明白为什么 - 理论上 - 它不能在某个低级别上恢复,并且不能将 SIGSEGV 转换为标准软件异常。

请解释为什么在分段错误之后程序处于不确定状态,因为很明显,在内存实际更改之前抛出了错误(我可能是错的,不明白为什么)。如果它被抛出,人们可以创建一个程序来更改受保护的内存,一次一个字节,出现分段错误,并最终重新编程内核 - 这种安全风险并不存在,因为我们可以看到世界仍然存在。

  1. 分段错误究竟何时发生(=何时发送SIGSEGV)?
  2. 为什么该进程在该点之后处于未定义的行为状态?
  3. 为什么无法恢复?
  4. 为什么这个解决方案可以避免这种不可恢复的状态?甚至吗?

c c++ exception segmentation-fault

112
推荐指数
11
解决办法
1万
查看次数

第二次无法捕获分段错误

我试图在发生分段错误时重新启动程序。

我有以下最小的可重现代码:-

#include <csignal>
#include <unistd.h>
#include <iostream>

int app();

void ouch(int sig) {
    std::cout << "got signal " << sig << std::endl;
    exit(app());
}

struct L { int l; };
static int i = 0;

int app() {
    L *l= nullptr;
    while(1) {
        std::cout << ++i << std::endl;
        sleep(1);
        std::cout << l->l << std::endl; //crash
        std::cout << "Ok" << std::endl;
    }
}

int main() {
    struct sigaction act;
    act.sa_handler = ouch;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGKILL, &act, 0);
    sigaction(SIGSEGV, …
Run Code Online (Sandbox Code Playgroud)

c++ linux segmentation-fault

2
推荐指数
1
解决办法
147
查看次数

标签 统计

c++ ×2

segmentation-fault ×2

c ×1

exception ×1

linux ×1