2 duniyue duniyue 于 2015.07.24 13:19 提问

在函数返回调用时出现缓冲区溢出问题

bool intersp3(GMO &gmo,SP3 (&sp3)[3],INSP3 &insp3)
{
int gpsnum,sp3num;
sininter sdata;
gpsnum=gmo.gpsdata.size();
sp3num=sp3[1].data.size();
for(int i=0;i<gpsnum;i++)
{
for(int k=0;k<sp3num-1;k++)
{
if(gmo.gpsdata[i].hdr.epoch.isequal(sp3[1].data[k].epoch))
{
sdata.epoch=gmo.gpsdata[i].hdr.epoch;
for(int j=1;j<33;j++)
{
sdata.inter[j][0]=sp3[1].data[k].rec[j].x;
sdata.inter[j][1]=sp3[1].data[k].rec[j].y;
sdata.inter[j][2]=sp3[1].data[k].rec[j].z;
}
break;
}
else if(gmo.gpsdata[i].hdr.epoch.dayu(sp3[1].data[k].epoch)&&
gmo.gpsdata[i].hdr.epoch.xiaoyu(sp3[1].data[k+1].epoch))
{
//TODO Sliding Lagrange interpolation;
break;
}
else
continue;
}
insp3.sp3data.push_back(sdata);
}
cout<<"finished interpolation sp3 file"<<endl;
return 1;
}
程序还没写完,但是在函数返回调用时出现
图片说明
大神们,这个怎么解?
————————程序白痴

1个回答

oyljerry
oyljerry   Ds   Rxr 2015.07.24 13:24

for(int i=0;i<gpsnum;i++)
{
for(int k=0;k<sp3num-1;k++)
{
if(gmo.gpsdata[i].hdr.epoch.isequal(sp3[1].data[k].epoch))
{
sdata.epoch=gmo.gpsdata[i].hdr.epoch;
for(int j=1;j<33;j++)
{
sdata.inter[j][0]=sp3[1].data[k].rec[j].x;
sdata.inter[j][1]=sp3[1].data[k].rec[j].y;
sdata.inter[j][2]=sp3[1].data[k].rec[j].z;
}

你这些数组操作可能超过了传进来的参数数组的有效范围。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
vs2015实现缓冲区溢出攻击
实验环境:编译器:vs2015 系统:win10 64位实验原理如上图所示,栈地址增长方向是向低地址方向增长的,每次调用函数时,先把参数压入栈底,然后会把被调用函数的返回地址(此地址为call指令下一条指令)压到栈底。另外还需要保存main函数的栈底地址在栈里面,被调用函数的栈顶指针esp被保存为该函数的栈底,接下来的低地址位分配局部变量。如果c/c++没有检测局部变量内容越界问题,那么,局部变量
栈缓冲区溢出原理
当进行函数调用时,会首先将call指令的下一条指令地址压栈 Call指令向EIP中填写被调用函数的地址 当被调用函数返回时,从栈上弹出返回地址,装入EIP,使程序指令流重新返回调用者。 通过缓冲区溢出可以覆盖栈上的返回地址,在函数调用返回时,将错误的返回地址装入EIP,从而改变指令流,达到改变程序执行的目的。
C++对象模型之编译器如何处理函数返回一个对象
1、与经验不符的输出我们知道,当发生以下三种情况之一时,对象对应的类的复制构造函数将会被调用:1)对一个对象做显示的初始化操作时2)当对象被当作参数传递给某个函数时3)当函数返回一个类的对象时所以,当我们设计一下函数(普通或成员函数)时,经验告诉我们,出于效率的考虑,应该尽可能返回一个对象的指针或引用,而不是直接返回一个对象。因为在直接返回一个对象可能会引起对象的复制构造过程,这意味着会发生一定量
汇编语言函数调用小结及缓冲区溢出的利用
本文以C语言中的write函数为例,以汇编代码的形式,探讨该函数运行时内存中的情况。并讲解了一种缓存区溢出的利用方式。
防止缓冲区溢出
C 中大多数缓冲区溢出问题可以直接追溯到标准 C 库。最有害的罪魁祸首是不进行自变量检查的、有问题的字符串操作(strcpy、strcat、sprintf 和 gets)。一般来讲,象“避免使用 strcpy()”和“永远不使用 gets()”这样严格的规则接近于这个要求。 今天,编写的程序仍然利用这些调用,因为从来没有人教开发人员避免使用它们。某些人从各处获得某个提示,但即使是优秀的开发人
践踏堆栈-缓冲区溢出漏洞
践踏堆栈-缓冲区溢出漏洞 打算写这篇文章是因为在网上看过一篇论文,讲了缓冲区溢出破坏堆栈来执行恶意程序的漏洞。该论文请见参考资料1。这篇文章会涉及一些汇编的基础知识,以及虚拟内存的一些基本概念等。当然用来调试程序的系统是linux,工具是gcc。很久没有看过汇编和C语言了,错漏之处,还请指正。 1.概要 文章标题有提到堆栈和缓冲区,那么就先来探讨下这几个名词的定义。这里的缓冲区,指的就是计算
bufbomb关于缓冲区溢出攻击
smoke 要求:构造攻击字符串作为目标程序输入,造成缓冲区溢出,使getbuf()返回时不返回到test函数,而是转向执行smoke 思路: 理解了getbuf栈的构成:开辟的空间[1][2][3]…[32]+rbp+返回地址 只需要把getbuf返回的地址设置为smoke地址即可(开始的时候因为不理解栈的结构,发懵了很久) 第一步:确定开辟空间大小00000000004018b9 <g
C++缓冲区溢出
gets(char* ) 根本不执行边界检查,它会向缓冲区连续写入,其危险级别可以说是近乎C/C++中最高。 遇到 EOF 字符或换行字符之前,不会停止读入文本,这还都不算什么,这个函数最可怕的一点是会写出堆溢出; 作为一个替代方法,可以使用方法 fgets()。它可以做与 gets() 所做的同样的事情,但它接受用来限制读入字符数目的大小参数,因此,提供了一种防止缓冲区溢出的方法。
关于缓冲区到函数返回地址分析
用gdb调试可执行程序h(从附件下载h.tar.gz),计算缓冲区起始地址与函数foo返回地址的距离的调试过程
栈的缓冲区溢出研究
栈的缓冲区溢出研究