为了账号安全,请及时绑定邮箱和手机立即绑定

检测到堆栈粉碎

检测到堆栈粉碎

C
呼唤远方 2019-08-09 16:37:47
检测到堆栈粉碎我正在执行我的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与堆栈相关的错误不能很好地工作,但是像调试器一样,它可以帮助你精确定位崩溃的位置和原因。


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 786 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信