继我之前的问题之后,大多数评论都说“不要这样做,你处于一种不确定的状态,你必须杀死一切并重新开始”。还有一个“安全”的解决方法。
我不明白的是为什么分段错误本质上是不可恢复的。
写入受保护内存的时刻被捕获 - 否则,将SIGSEGV不会被发送。
如果可以捕获写入受保护内存的时刻,我不明白为什么 - 理论上 - 它不能在某个低级别上恢复,并且不能将 SIGSEGV 转换为标准软件异常。
请解释为什么在分段错误之后程序处于不确定状态,因为很明显,在内存实际更改之前抛出了错误(我可能是错的,不明白为什么)。如果它被抛出,人们可以创建一个程序来更改受保护的内存,一次一个字节,出现分段错误,并最终重新编程内核 - 这种安全风险并不存在,因为我们可以看到世界仍然存在。
SIGSEGV)?假设一个5级流水线架构(IF =指令获取,ID =指令解码,EX =执行,MEM =存储器访问,WB =寄存器写回).有4条指令必须执行.
(这些样本说明不准确,但我相信这一点会被理解)
在第五个时钟周期,这些指令将在管道中,如下所示.
添加a,b,c [IF ID EX MEM WB]
添加a,b,d [IF ID EX MEM]
添加a,b,e [IF ID EX]
添加a,b,f [IF ID]
现在,如果发生硬件中断,这些指令会发生什么.只有在执行流水线中的所有指令后才能处理中断吗?是否会以不同的方式处理软件中断和异常?
这是我为SIGABRT信号设置处理程序的代码,然后我调用abort()但处理程序没有被触发,而程序被中止,为什么?
#include <iostream>
#include <csignal>
using namespace std;
void Triger(int x)
{
cout << "Function triger" << endl;
}
int main()
{
signal(SIGABRT, Triger);
abort();
cin.ignore();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
计划产出:

当我编写以下代码时,我得到了预期的错误error: array size missing in 'data'。
int main()
{
unsigned char data[];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行相同的代码但将违规行包装在 a 中时struct,没有错误。
typedef struct credit_card_s
{
unsigned char is_valid;
unsigned char data[];
} credit_card_t;
Run Code Online (Sandbox Code Playgroud)
谁能向我解释为什么允许这样做?