new的越界访问

今天敲代码的时候发现了一个BUG和大家分享一下,希望大家下次不要犯和我一样的错误。

如果犯了和我一样的错,也能知道自己错在哪里!   <(^-^)>

函数如下:(斐波那契数列的实现)

long long FibonacciSeq( int n)
{
	long long *fib=new long long[n+1];
	fib[0] = 0;
	fib[1] = 1;
	for (int i = 2;i <=n; i++)
	{
		fib[i] = fib[i - 1] + fib[i - 2];
	}
	long long ret = fib[n];
	delete[] fib;
	return ret;
}

如果传给函数的参数是0,程序就会因为触发一个断点而崩溃。

单步调试,根据内存窗口就会发现问题所在!

fib指向的内存初始化完成后,其的内存情况如上图,

我们可以观察到这块内存的前后都有 fd fd fd fd  ,

0xFD为初始化受保护的内存(debug 版在动态分配内存的前后加入保护内存以防止越界访问)

而fib[1] = 1; 正好把 fd fd fd fd 以及它后面的四个字节改为了01 00 00 00 00 00 00 00 ,如下图:

程序运行到delete[] fib;时只找到了“受保护的内存标志”的起始位置,另外一个“受保护的内存标志”找不到了,所以程序运行会失败!

其实很简单,也就是发生了越界访问!我只new了一块空间,却存了两个变量,当然不行了!

时间: 2024-10-12 22:16:25

new的越界访问的相关文章

Oracle字符乱码、数据越界访问典型Bug分析

前言: 作为乙方,在甲方客户那里验收阶段发现两个诡异Bug.以下就问题来源.问题根因.解决方案.如何避免做详细描述. 一.Bug1:Oracle读写字符乱码. 1.问题来源 Oracle数据库监听http://blog.csdn.net/laoyang360/article/details/46524519 需要获取最新插入的中文类别字符,以判定分类.单步调试发现每次接收到的都是乱码. 2.问题根因 编码格式不一致导致. 3.解决方案 第一步:查看oracle自身的编码格式,可以通过命令sele

IOS上解决内存越界访问问题

IOS经常会混合使用C代码,而在C中,对内存的读写是很频繁的操作. 其中,内存越界读写 unsigned char* p =(unsigned char*)malloc(10); unsigned char c = *(p+100) ; free(p); 是一种很容易犯的错误,在大部分情况下,这段代码是不会暴露问题的. 如果越界写内存,比如: unsigned char* p =(unsigned char*)malloc(10); *(p+100) ='c'; free(p); 比如: uns

内存地址越界访问异常

在做循环链表习题的时候,当我进行结点删除操作时,发生如下异常: 调试后发现,异常发生在free()在释放空间时,如果把free注释,异常将不会发生 最初的代码是这样的: typedef struct LNode{ DataType data; LNode *next;}LNode,*LinkList;int InterList(LinkList &head){ int count,i; LinkList p,q; head=(LinkList)malloc(sizeof(LinkList));

OpenCV:Mat元素访问方法、性能、代码复杂度以及安全性分析

欢迎转载,尊重原创,所以转载请注明出处: http://blog.csdn.net/bendanban/article/details/30527785 本文讲述了OpenCV中几种访问矩阵元素的方法,在指定平台上给出性能比较,分析每种矩阵元素访问方法的代码复杂度,易用性. 一.预备设置 本文假设你已经正确配置了OpenCV的环境,为方便大家实验,在文中也给出了编译源程序的Makefile,其内容如代码段1所示. 采用如代码段2所示的计时函数,这段代码你可以在我之前的博文中找到,abtic()

一个简单的指针访问错误

对于几乎没什么工程经验的我来说,找个印象深刻的bug也是一件很难的事情啊.下面还是刚刚接触C语言时候犯过的一个错误, 刚刚接触指针,写了一段代码,通过指针int * pa访问动态数组int *a = (int *)malloc(sizeof(int)*2). 初始化pa = a; 写了个循环遍历数组时,不想通过下标来访问,而是通过加循环索引idx来遍历,每次循环pa = pa + idx;idx初始化为0,每次循环idx++ for(idx=0;idx<2;idx++){ pa = pa+idx

Linux内核情景分析之异常访问,用户堆栈的扩展

情景假设: 在堆内存中申请了一块内存,然后释放掉该内存,然后再去访问这块内存.也就是所说的野指针访问. 当cpu产生页面错误时,会把失败的线性地址放在cr2寄存器.线性地址缺页异常的4种情况 1.如果cpu访问的行现地址在内核态,那么很可能访问的是非连续区,需要vmalloc_fault处理. 2.缺页异常发生在中断或者内核线程时,直接失败,因为不可修改页表 3.地址在一个区间内,那就可能是已经物理地址映射了但权限问题(错误处理)或者其物理地址没有分配(分配物理内存) 4.如果找到一个在线性地址

几个C++内存泄漏和越界检测工具简介

一.BoundsChecker    或许你还不知道大名顶顶的Nu-Mega,但一定听说过他们的产品SoftICE,BoundsChecker也是这家公司的产品.与Visual C++配合使用,据说威力强大.本人和没有实际用过,在此复制一下百度百科的简介,好有个简单的认识.    BoundsChecker是一个运行时错误检测工具,它主要定位程序运行时期发生的各种错误.它通过驻留在Visual C++开发环境内部的自动处理调试程序来加速应用程序的开发,缩短产品发布时间.BoundsChecker

CVE-2015-7645分析及利用

Hack team之后adobe和google合作对flash进行了大改,一度提高了flash的利用门槛,CVE-2015-7645作为第一个突破这些限制的漏洞利用方式,可以作为vetect利用方式之后的一个模板,应该是今年最后一篇技术文章了哈哈. 漏洞分析 POC由三个as文件superexternalizable,subexternalizable,externalizable组成. 该漏洞由IExternalizable导致,这个类导出两个函数readExternal和writeExter

Java的特点

Java是一种"简单".面向对象.分布式.解释型.健壮.安全.体系结构中立.可移植.高性能和动态的编程语言. 简单:Java的设计目的是让专业程序员觉得既易学又好用.假设你有编程经历,你将不觉得Java难掌握,如果你已经理解面向对象编程的基本概念,学习Java见更加容易. 面向对象:面向对象是现代编程语言的重要特征之一,面向对象技术极大的提高了人们的软件开发能力. 分布式:分布式包括数据分布和操作分布.数据分布是指数据可以分散在网络的不同主机上,操作分布是指把一个计算分散在不同主机上进