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

标签 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后不终止下一条语句就不会终止它?

最佳答案

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

在函数返回之前,不检查堆栈(即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;
}

在打印“Back in main”之前查看程序是否终止

关于c - C程序仅在GCC中执行后才终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50434912/

相关文章:

c - 为什么 -fpie 在裸机代码中不起作用并导致野指针?

GWT 2.5.0 编译器异常

c - union 元素对齐

c - 如何在C中向链表中执行插入、删除和显示元素?

c - 使用 qsort() 对组合结构进行排序

c - LeetCode 189 旋转数组 : heap-buffer-overflow

c - 如何从 C 文件中获取完整的汇编代码?

c++ - 加载共享库时出错 : libgomp. so.1 : , GCC 版本错误?

c++ - 当出现不明确的默认参数时,C++ 编译器会做什么?

compiler-construction - 如何在 lex 和 yacc 中读取多行输入?