检测到堆栈粉碎

检测到堆栈粉碎

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

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

可能的原因是什么?如何纠正?


呼唤远方
浏览 787回答 3
3回答

MM们

这里的Stack Smashing实际上是由于gcc用来检测缓冲区溢出错误的保护机制引起的。例如,在以下代码段中:#include&nbsp;<stdio.h>void&nbsp;func(){ &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;array[10]; &nbsp;&nbsp;&nbsp;&nbsp;gets(array);}int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){ &nbsp;&nbsp;&nbsp;&nbsp;func();}编译器(在本例中为gcc)添加了具有已知值的保护变量(称为canaries)。大小大于10的输入字符串会导致此变量损坏,从而导致SIGABRT终止程序。为了获得一些见解,您可以尝试 -fno-stack-protector 在编译时使用选项禁用gcc的这种保护&nbsp;。在这种情况下,当您尝试访问非法内存位置时,您将收到不同的错误,很可能是分段错误。请注意,-fstack-protector应始终为发布版本打开,因为它是一种安全功能。您可以通过使用调试器运行程序来获取有关溢出点的一些信息。Valgrind与堆栈相关的错误不能很好地工作,但是像调试器一样,它可以帮助你精确定位崩溃的位置和原因。
打开App,查看更多内容
随时随地看视频慕课网APP