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"