小编典典

检测到堆栈粉碎

all

我正在执行我的 a.out 文件。执行后程序运行一段时间然后退出并显示消息:

**** stack smashing detected ***: ./a.out terminated*
*======= Backtrace: =========*
*/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)Aborted*

这可能是什么原因,我该如何纠正?


阅读 110

收藏
2022-04-13

共1个答案

小编典典

这里的 Stack Smashing 实际上是由于 gcc 用于检测缓冲区溢出错误的保护机制造成的。例如在以下代码段中:

#include <stdio.h>

void func()
{
    char array[10];
    gets(array);
}

int main(int argc, char **argv)
{
    func();
}

编译器(在本例中为 gcc)添加了具有已知值的保护变量(称为金丝雀)。大小大于 10 的输入字符串会导致此变量损坏,从而导致 SIGABRT 终止程序。

要获得一些见解,您可以尝试在编译时使用选项禁用 gcc 的这种保护 -fno-stack-protector。在这种情况下,您将收到一个不同的错误,很可能是在您尝试访问非法内存位置时出现分段错误。请注意,-fstack- protector应该始终为发布版本打开它,因为它是一项安全功能。

您可以通过使用调试器运行程序来获取有关溢出点的一些信息。Valgrind
不能很好地处理与堆栈相关的错误,但就像调试器一样,它可以帮助您查明崩溃的位置和原因。

2022-04-13