Bab*_*boB 2 c compiler-construction gcc
我有意在我的程序中进行了一个超出范围的索引访问,如下所示:
#include<stdio.h>
int main()
{
int x[1];
x[1] = 3; // expected SIGABRT here
printf("x[1] = %d\n",x[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是我的程序只在执行了我期待中止的行之后才被终止.调试时发生了同样的情况.找到下面的输出.
x[1] = 3
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
我知道C没有超出检查功能.我的问题是为什么它没有在执行x [1] = 3而没有进入下一个语句时终止?
我假设这是关于使用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;
}
Run Code Online (Sandbox Code Playgroud)
在打印"Back in main"之前查看程序是否终止