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

今天运行程序,改了一段代码!然后每次一运行程序就异常退出,打印如下信息:
*** buffer overflow detected ***: ./shm_costomer terminated
Aborted
根据单词的意思是缓存越界的问题!自己反复检查了自己修改的那部分代码,发现不存在这种情况!然后直接把自己这段代码屏蔽掉重新编译再运行,发现程序还是挂掉了!但是这个程序之前几个月都运行的好好的,就在我运行的上一分钟还是运行的好好的!我开始怀疑是硬件出问题了或是板子上的linux系统抽风了!取消屏蔽部分!重新编译,然后下载到另一板子上去运行,妈蛋,能正常运行!一样的板子一样的系统!然后我又在我的板子上跑测试程序,也可以!跑其他的应用程序也是可以正常运行!虽然问题百思不得其解,但是具体原因应该能确定90%的可能是软件部分的BUG,但是为什么是突然一下子爆发出来了呢?之前为啥一直能正常运行呢?
百度了下这个错误,然来是个老生常谈的问题!原来有很多前辈们也遇到过!
自己总结了一下问题可能出在两个地方:
1. GCC编译器版本问题
2. 程序中的缓冲区写超出了其长度的内容(比如使用了C库中不安全的函数,没有对输入的参数进行合法性检测,像strcpy、sprintf、strcat、scanf等)

首先我基本能排除编译器的问题,因为编译其他的程序能运行,而且我编译的这个程序在另一个相同的板子上也能运行!而且编译器出问题的可能性也不大
现在问题基本能确定是在我程序部分了!但是很奇怪,我的板子运行报错,在另一个相同的板子上能正确运行!
报错截图:框框里面的部分是我调试打印的一些信息可忽略!

应用程序运行***buffer overflow detected*** terminated Aborted异常退出问题_第1张图片

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

应用程序运行***buffer overflow detected*** terminated Aborted异常退出问题_第2张图片

第二个红色箭头部分,比如把整型数2016转变成字符型2016,实践证明图上写法是不安全的,应该这样:sprintf(SYear,"%04d",year); 或者 sprintf(SYear,"%4d",year);//转化为字符串类型
这里%d 和 %04d 的区别:
只把有符号整型year转换为字符串,长度不确定
把有符号整形year转化为字符长度为4的字符串,长度确定
改好之后问题就over了!
这个问题是突然冒出来的!百度百科这个做的还是挺给力!这里顺便还了解了缓存区溢出的一些相关知识!
————————————————
版权声明:本文为CSDN博主「coding__madman」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/coding__madman/article/details/51506986

你可能感兴趣的:(系统,C++,C++,溢出,buffer,overflow,detected)