首页 > 解决方案 > C 程序只有在 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 之后没有终止而不执行下一条语句?

标签: cgcccompiler-construction

解决方案


我假设这是关于使用金丝雀值来检测利用堆栈缓冲区溢出的尝试。

在函数返回之前,不会检查堆栈(又名金丝雀值)。因此,您将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”之前查看程序是否终止


推荐阅读