c - 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 之后没有终止而不执行下一条语句?
解决方案
我假设这是关于使用金丝雀值来检测利用堆栈缓冲区溢出的尝试。
在函数返回之前,不会检查堆栈(又名金丝雀值)。因此,您将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”之前查看程序是否终止
推荐阅读
- angular - Primeng inputMask autoClear 没有按照文档工作
- mathematical-optimization - 使用 SCS 执行 SDP 的椭球拟合期间的数值问题?
- c++ - 求解具有未知幂的模幂
- c - strcmp() 2 个变体返回不同,为什么?
- clojure - clojure中循环drop和take组合的解释
- sql - Oracle SQL-如果满足该行的条件,则从第二个表添加列
- python - 改变函数参数的类型提示装饰器
- python - 当我尝试将 JSON 文件读取为 Pandas 时出错
- c - 为什么我不能检查我是否在 tdm-gcc 编译器中包含了 stdlib.h?
- python - PySide2:窗口没有响应