关于buffer overflow detected 程序崩溃的思考

原创 2015年07月09日 08:45:51

我是在使用别人源码(DBT2 benchmark)的时候,编译成功然后运行就出现了这个问题。本以为像这种开源的软件应该没什么太明显的bug,但是后来细想,buffer overflow暗示着指针操作内存不当导致程序崩溃。。。遇到问题后,首先百度了一下,很多篇博客也提到了相同的问题,解决方案几乎都是针对什么ubuntu gcc版本,查看一下自己的gcc版本是4.4而且yum源最新,就觉得这个解决方法不靠谱至少在我的环境中不适用。于是乎又转战到google和stackoverflow寻找答案,http://stackoverflow.com/questions/14172409/buffer-overflow-detected-in-a-program-that-runs-flawlessly-apparently 这里给我了启发,他是在做字符串操作的时候出现的这个问题,让我想到了我用的这个程序应该也是出现了指针错误、内存越界之类的问题。幸运的是DBT2 benchmark是手动编译源码的,所以有src。最后的解决方案就是看源码调试源程序。

src/

client.c
db_threadpool.c
db.c
mysql/dbc_common.c
include/mysql_common.h

程序编译完以后是执行client,所以以client为入口调试程序。由于对源程序不了解,所以直接看源码顺便打上一些输出作为调试信息。

依赖关系为:client.c -> db_threadpool.c -> db.c -> mysql/dbc_common.c......,由于程序中本身就有一些输出,崩溃时观察到db_threadpool.c中的printf点有输出正确地信息,后续就没有输出了,dbc_common.c中的LOG_ERROR_MESSAGE也没有输出,同时在这里也发现了大量的strcpy,它把传入进来的字符串参数值全部strcpy拷贝到mysql_开头的全局变量中,于是在每个strcpy后面都添加printf输出当前字符串。重新编译运行,终于发现了终止的地方,mysql_host这个字符串变量的值没输出。再次打开dbc_common.c才恍然大悟,该文件中定义的几个mysql_全局char数组,都是定长的,比如32个字节,万一我们传入的参数大于31个字符,strcpy必然会出问题,检查参数发现,mysql_host字符串长度不止31,所以这里导致了overflow的bug。我把全局变量mysql_host的长度改成了1024 ,重新编译运行,又报出了定义冲突的问题,原来是在include/mysql_common.h中声明了externt char mysql_host[32],这里也需要改成一样的。最后这个bug便修复了。

返回来重新审视这个bug,仅仅是因为定义一个字符数组时分配的空间不足以容纳字符串,导致了buffer overflow detected的错误,所以我们在程序中对于内存空间的分配一定要掌握好,要么分配足够大的定长空间,要么就malloc动态开辟。他这里单纯地以为作为一个host用IP地址表示的话十几、二十个字符长度就够了,然而却没想到AWS的实例使用了非常长的域名,无法容纳导致程序终止,也是万万没想到会在这和小问题上栽跟头。



buffer overflow detected错误

最近在写并行程序的时候遇到这个问题,在上网查询之后发现好多是由于sprintf的缓冲区不够造成的,对比自己程序发现一个很低级的错误 char *sc = new char(100); sprintf...
  • qq100440110
  • qq100440110
  • 2016年05月24日 13:22
  • 894

应用程序运行***buffer overflow detected*** terminated Aborted异常退出问题

今天运行程序,改了一段代码!然后每次一运行程序就异常退出,打印如下信息: *** buffer overflow detected ***: ./shm_costomer terminated Abo...
  • coding__madman
  • coding__madman
  • 2016年05月26日 15:03
  • 2419

Buffer overrun detected!

Buffer overrun detected!
  • peng_zhanxuan
  • peng_zhanxuan
  • 2010年12月05日 14:42
  • 4414

Buffer overrun detected!

前任写的软件在客户运行时出现了一个“Buffer overrun detected!”的错误,还存在内存泄漏,现在要着手解决,但不知从何下手,因为在自己的环境下不能重现此错误,调试起来感觉没有着力点,...
  • charlieyjg
  • charlieyjg
  • 2008年06月02日 14:36
  • 1344

Buffer Overflow

From Wikipedia, the free encyclopedia In computer security and programming, a buffer overflow...
  • forevertravelyang
  • forevertravelyang
  • 2015年01月21日 11:29
  • 674

关于buffer overflow

可能是唯一一篇gb的写overflow的文章,好像译至aleph1的那篇文章 zer9提到后我才想起来把他贴上来,呵呵 Buffer Overflow 机理剖析 使用Buffer Overflow 方...
  • eroswang
  • eroswang
  • 2009年05月19日 23:18
  • 5466

瑞星导致VC++6 编译出现Buffer overrun detected!

这个错误搞死我了,让我搞了半天,连classview都出现了错误,后来在网上查到了:瑞星卡卡安全论坛 瑞星防火墙引起Visual C++ 6出现奇怪的问题:Buffer overrun detecte...
  • wuyijc
  • wuyijc
  • 2008年06月23日 11:32
  • 1698

How to debug a buffer overrun

dfefeaaf
  • liushu1231
  • liushu1231
  • 2014年04月21日 14:35
  • 2842

C/C++ and Buffer Overflow Topics

英文原文网址:http://www.tenouk.com/cncplusplusbufferoverflow.html 缓冲区溢出由于病毒与蠕虫在互联网的大规模影响而为人熟知。C/C++程序因为缓冲区...
  • taotaoyouarebaby
  • taotaoyouarebaby
  • 2014年04月18日 13:32
  • 1207

buffer overflow

可能是唯一一篇gb的写overflow的文章,好像译至aleph1的那篇文章 zer9提到后我才想起来把他贴上来,呵呵 Buffer Overflow 机理剖析 使用Buffe...
  • uiop78uiop78
  • uiop78uiop78
  • 2010年11月25日 19:54
  • 1360
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于buffer overflow detected 程序崩溃的思考
举报原因:
原因补充:

(最多只允许输入30个字)