我故意在程序中进行了超出范围的索引访问,如下所示:
#include<stdio.h>
int main()
{
int x[1];
x[1] = 3; // expected SIGABRT here
printf("x[1] = %d\n",x[1]);
return 0;
}
但是我的程序只有在执行我期望中止的那行之后才被终止。我调试时也发生了同样的情况。在下面找到输出。
x[1] = 3
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
我知道C没有边界检查功能。我的问题是,为什么在执行x [1] = 3后不终止下一条语句就不会终止它?
最佳答案
我假设这是关于使用Canary值来检测利用堆栈缓冲区溢出的尝试。
在函数返回之前,不检查堆栈(即canary值)。因此,您将首先执行printf
,然后执行堆栈检查。
换句话说,发生访问时不会检测到“越界”。因此程序继续执行直到函数返回。
您可以将令人讨厌的代码放入类似的函数中:
void foo()
{
int x[1];
x[1] = 3; // expected SIGABRT here
printf("x[1] = %d\n",x[1]);
}
int main()
{
foo();
printf("Back in main\n");
return 0;
}
在打印“Back in main”之前查看程序是否终止
关于c - C程序仅在GCC中执行后才终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50434912/