C 程序仅在 GCC 中执行后终止
C Program terminated only after it has executed in GCC
我故意在我的程序中进行了越界索引访问,如下所示:
#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 后没有执行下一条语句而没有终止?
我假设这是关于使用金丝雀值来检测利用堆栈缓冲区溢出的尝试。
直到函数 returns 才检查堆栈(又名金丝雀值)。因此,您将首先执行 printf
,然后执行堆栈检查。
换句话说,"out of bounds" 访问不会在它发生的那一刻被检测到。所以程序继续执行,直到函数 returns.
您可以将有问题的代码放入如下函数中:
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"
我故意在我的程序中进行了越界索引访问,如下所示:
#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 后没有执行下一条语句而没有终止?
我假设这是关于使用金丝雀值来检测利用堆栈缓冲区溢出的尝试。
直到函数 returns 才检查堆栈(又名金丝雀值)。因此,您将首先执行 printf
,然后执行堆栈检查。
换句话说,"out of bounds" 访问不会在它发生的那一刻被检测到。所以程序继续执行,直到函数 returns.
您可以将有问题的代码放入如下函数中:
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"