我正在执行我的 a.out 文件。执行后程序运行一段时间然后退出并显示消息:
**** stack smashing detected ***: ./a.out terminated* *======= Backtrace: =========* */lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)Aborted*
这可能是什么原因,我该如何纠正?
这里的 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应该始终为发布版本打开它,因为它是一项安全功能。
-fno-stack-protector
-fstack- protector
您可以通过使用调试器运行程序来获取有关溢出点的一些信息。Valgrind 不能很好地处理与堆栈相关的错误,但就像调试器一样,它可以帮助您查明崩溃的位置和原因。