我故意在我的程序中进行了一个超出范围的索引访问,如下所示:
#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后没有进行下一个语句就没有终止?
答案 0 :(得分:6)
我认为这是关于使用canary值来检测利用堆栈缓冲区溢出的尝试。
在函数返回之前,不检查堆栈(也称为金丝雀值)。因此,您首先执行printf
,然后执行堆栈检查。
换句话说,&#34;越界&#34;在它发生的那一刻,没有检测到访问。所以程序一直持续到函数返回。
您可以将违规代码放入以下函数中:
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;
}
查看程序是否在打印之前终止&#34;返回主要&#34;