检测到堆栈粉碎我正在执行我的a.out文件。执行后程序运行一段时间然后退出并显示以下消息:**** stack smashing detected ***: ./a.out terminated**======= Backtrace: =========**/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)Aborted*可能的原因是什么?如何纠正?
3 回答
MM们
TA贡献1886条经验 获得超2个赞
这里的Stack Smashing实际上是由于gcc用来检测缓冲区溢出错误的保护机制引起的。例如,在以下代码段中:
#include <stdio.h>void func(){ char array[10]; gets(array);}int main(int argc, char **argv){ func();}
编译器(在本例中为gcc)添加了具有已知值的保护变量(称为canaries)。大小大于10的输入字符串会导致此变量损坏,从而导致SIGABRT终止程序。
为了获得一些见解,您可以尝试 -fno-stack-protector
在编译时使用选项禁用gcc的这种保护 。在这种情况下,当您尝试访问非法内存位置时,您将收到不同的错误,很可能是分段错误。请注意,-fstack-protector
应始终为发布版本打开,因为它是一种安全功能。
您可以通过使用调试器运行程序来获取有关溢出点的一些信息。Valgrind与堆栈相关的错误不能很好地工作,但是像调试器一样,它可以帮助你精确定位崩溃的位置和原因。
- 3 回答
- 0 关注
- 786 浏览
添加回答
举报
0/150
提交
取消