buffer overflow detected错误

最近在写并行程序的时候遇到这个问题,在上网查询之后发现好多是由于sprintf的缓冲区不够造成的,对比自己程序发现一个很低级的错误

char *sc = new char(100);
sprintf(sc, "%d", rank);
string temp = sc;
string str = "./read_time/read_time" + temp;
ofstream fread_time(str.c_str());
fread_time << static_cast<double>(duration) / static_cast<double>(1000) << "ms" << endl;
delete sc;

应该写成

char *sc = new char[100];

之前在自己单机上调试并没有出现问题,在服务器上暴露出来一直以为是服务器的问题,后来发现这个小错误,但是很奇怪的是为什么在本机的编译器上调试是显示正确的呢?即使如此访问越界都不提示出错,

int *t = new int;
cout << *(t+1000) << endl;
这跟具体编译器的实现有关,编译器保证不一定正确,但是不能保证一定不正确,所以不要太相信编译器


类似的问题(以下都是错误的做法,只不过某些时候不会提示出错,记住程序不崩溃,不意味没有错误。)

1 访问野指针也不一定出错,看运气,因为这段空间暂时还没有被其他数值替代,为了防止野指针,free(p); p = NULL;

http://bbs.csdn.net/topics/390289950

2 通过类的空指针访问成员函数

http://bbs.csdn.net/topics/390593999

3 析构函数

http://bbs.csdn.net/topics/390594036

4 堆内存析构之后继续访问

http://bbs.csdn.net/topics/290036553

5 析构对象后还能输出成员变量的值

Short Answer: 对象被销毁后再访问其内容结果不可预测.
Long Answer: 堆上的对象被销毁后,其内存空间可能不会马上被利用,因此销毁后的短时间内去访问还能得到原来的内容. 栈上对象在销毁后,其所占空间很可能马上被占用(例如函数调用的返回地址,参数压栈,等等.特别地,debug版程序为了防止错误,在函数调用开始和结束时会刷新栈内容),因此得不到原内容.

http://bbs.csdn.net/topics/120007684

http://bbs.csdn.net/topics/390517352

http://bbs.csdn.net/topics/300221654

http://bbs.csdn.net/topics/330262651

9 数组访问越界,程序不一定出错

http://bbs.csdn.net/topics/390610524

10 delete[]的不解

http://bbs.csdn.net/topics/390617966?page=1#post-395816628

11 http://bbs.csdn.net/topics/390641992

12 字符串访问越界

http://bbs.csdn.net/topics/390644143?page=1#post-396100280

引用\[1\]中提到了程序中使用了缓存数组,并且进行了合法性检测,因此溢出越界的问题可能性很小。引用\[2\]中提到了在使用别人的源码时出现了buffer overflow detected的问题,通过查看gcc版本和搜索相关解决方案,最终通过调试源码解决了问题。引用\[3\]中指出了一个常见的导致buffer overflow detected错误的原因是定义的字符数组空间不足以容纳字符串,因此在程序中对内存空间的分配要掌握好,要么分配足够大的定长空间,要么使用malloc动态开辟空间。 综上所述,buffer overflow detected错误通常是由于程序中对缓存数组的操作导致的。解决这个问题的方法包括进行合法性检测、使用缓存溢出检测工具、查看gcc版本并搜索相关解决方案、调试源码以及正确分配内存空间。 #### 引用[.reference_title] - *1* [应用程序运行***buffer overflow detected*** terminated Aborted异常退出问题](https://blog.csdn.net/coding__madman/article/details/51506986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [关于buffer overflow detected 程序崩溃的思考](https://blog.csdn.net/hustsselbj/article/details/46811973)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值