C程序仅在GCC中执行后终止

时间:2018-05-20 12:37:23

标签: c gcc compiler-construction

我故意在我的程序中进行了一个超出范围的索引访问,如下所示:

#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后没有进行下一个语句就没有终止?

1 个答案:

答案 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;