您的位置:首页 > Web前端

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

2016-05-26 15:03 471 查看
今天运行程序,改了一段代码!然后每次一运行程序就异常退出,打印如下信息:

*** buffer overflow detected ***: ./shm_costomer terminated

Aborted

根据单词的意思是缓存越界的问题!自己反复检查了自己修改的那部分代码,发现不存在这种情况!然后直接把自己这段代码屏蔽掉重新编译再运行,发现程序还是挂掉了!但是这个程序之前几个月都运行的好好的,就在我运行的上一分钟还是运行的好好的!我开始怀疑是硬件出问题了或是板子上的linux系统抽风了!取消屏蔽部分!重新编译,然后下载到另一板子上去运行,妈蛋,能正常运行!一样的板子一样的系统!然后我又在我的板子上跑测试程序,也可以!跑其他的应用程序也是可以正常运行!虽然问题百思不得其解,但是具体原因应该能确定90%的可能是软件部分的BUG,但是为什么是突然一下子爆发出来了呢?之前为啥一直能正常运行呢?

百度了下这个错误,然来是个老生常谈的问题!原来有很多前辈们也遇到过!

自己总结了一下问题可能出在两个地方:

1. GCC编译器版本问题

2. 程序中的缓冲区写超出了其长度的内容(比如使用了C库中不安全的函数,没有对输入的参数进行合法性检测,像strcpy、sprintf、strcat、scanf等)

首先我基本能排除编译器的问题,因为编译其他的程序能运行,而且我编译的这个程序在另一个相同的板子上也能运行!而且编译器出问题的可能性也不大

现在问题基本能确定是在我程序部分了!但是很奇怪,我的板子运行报错,在另一个相同的板子上能正确运行!

报错截图:框框里面的部分是我调试打印的一些信息可忽略!



屏蔽或不屏蔽我增加的那部分代码效果都一样!那么如果有问题基本可以确定问题是在其他部分!

程序中使用的缓存数组比较多,自己写的代码,这个自己基本可以确定缓存数组出现溢出越界的问题可能性很小,因为使用都做了合法性检测,而且是经过反复测试的,一个一个的查我估计查一天也不见得查完!百度了一下网上有很多缓存溢出检测工具!这是查找问题的一种办法!再查一点我就这么做了!鉴于我的程序中使用了类似strcat函数,还有sprintf函数等,我首先还是查了哈程序中哪些地方使用了这些函数!然后一下子就发现了自己给自己挖的坑,粗心大意某个地方掉了一个04,还好问题暴露的早,发现的及时!这里截个图:



第二个红色箭头部分,比如把整型数2016转变成字符型2016,实践证明图上写法是不安全的,应该这样:sprintf(SYear,"%04d",year); 或者 sprintf(SYear,"%4d",year);//转化为字符串类型

这里%d 和 %04d 的区别:

只把有符号整型year转换为字符串,长度不确定

把有符号整形year转化为字符长度为4的字符串,长度确定

改好之后问题就over了!

这个问题是突然冒出来的!百度百科这个做的还是挺给力!这里顺便还了解了缓存区溢出的一些相关知识!

百度百科:缓存区溢出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息