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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值