边界访问的空间权限

简介: 边界访问的空间权限

前言

不了解代码实现时的一些原理在解决特殊的bug时是很痛苦的,今天看到了一个比较有意思的程序,能很好的表示C语言在边界访问的行为。


一、边界访问是什么

平时我们定义数组,比如写一个a[10]是一个非常正常的操作,如果我们一直扩大的去写申请数组大小的数字,因为数组申请的空间都是存在某一块特定位置的,那迟早我们申请的大小会超过那个位置的容量从而访问到不该访问的位置,其实这个数字在100000就已经出现问题了,但这一块的语法是对的,程序也会继续运行(写-10都不会报错),不过他是绝对没有申请到这么多空间的

二、边界访问举例

要判断申请的一个空间是否合法,主要分为两个操作,一个是这个空间定义在哪里,还有一个是定义多少的有效空间,第一件事情主要由操作系统完成,第二件事情主要由程序员自行检查完成,都是不归C语言管的,也就是说C语言是无越界检查的(但是编译器可能会有,C++也是有的)

下面看一串代码

下面是运行结果

这里可以发现原来存着的变量被改变了(这里就算是const int也会被改变,但是c++不会)

模拟一下栈的实现可以解释这个问题,如下图我们这个时候如果执行操作buf[4]的赋值,就自然会改到原先存在于这一块内存位置的值,于是出现了上述情况(有些编译器对于内存溢出赋值的操作是不会报错的)。但是在项目里我们并不能根据这个来直接进行错误的分析,因为每一个编译器对于变量即内存的管理还有是否判断溢出都是不一样的,我们只要做到不越界就好了。

一般如何在项目里比较好的规定边界呢?一个方法是数量,就是给你一个数,超过他了就是越界了,非常的直观,还有就是用模仿字符串实现方式,规定特殊结束标志。

相关文章
|
11月前
|
缓存 网络协议 算法
计算机网络常用知识总结!(二)
计算机网络常用知识总结!
449 4
|
存储 安全 数据库
Flask框架中,如何实现用户身份验证和会话管理
Flask框架中,如何实现用户身份验证和会话管理
|
Linux
【Linux命令200例】cmp文件比较工具
cmp命令是Linux系统中的一个文件比较工具,用于比较两个文件是否相同以及找出两个文件之间的差异。它会逐字节地比较两个文件的内容,如果两个文件完全相同,则不显示任何输出;如果有差异,则会显示出差异之处的偏移量和十进制编码。
462 0
39Echarts - 柱状图(Wheater Statistics)
39Echarts - 柱状图(Wheater Statistics)
88 0
|
机器学习/深度学习 传感器 算法
【地震】基于有限差分 (FDTD) 模拟地震超材料(晶体)时域分析附matlab代码
【地震】基于有限差分 (FDTD) 模拟地震超材料(晶体)时域分析附matlab代码
|
机器学习/深度学习 算法 开发者
违背基本假设-4| 学习笔记
快速学习违背基本假设-4。
违背基本假设-4| 学习笔记
|
关系型数据库
企业应用架构实践(复杂性应对之道)
#前言 从业这么多年,接触过银行的应用,Apple的应用,eBay的应用和现在阿里的应用,虽然分属于不同的公司,使用了不同的架构,但有一个共同点就是都很复杂。导致复杂性的原因有很多,如果从架构的层面看,主要有两点,一个是架构设计过于复杂,层次太多能把人绕晕。另一个是根本就没架构,ServiceImpl作为上帝类包揽一切,一杆捅到DAO(就简单场景而言,这种[Transaction Script]
10240 2
|
运维 监控 云栖大会
We Make AI-Ops Happen 杭州云栖大会——智能运维专场即将开启
支持百万级规模服务器管控,保障双十一世界级工程生产运行安全的智能运维体系;直击阿里全球运行指挥中心双11的隐形战场;大规模文件分发系统,承载了整个阿里集团文件分发。We Make AI-Ops Happen 杭州云栖大会——智能运维专场即将开启!
3127 0
|
JavaScript 前端开发
jQuery| 添加多个标签元素
在jquery中如何实现添加多个标签元素?通过 append() 、 prepend() after() 、 before() 方法添加若干新元素 下面的例子中,我们创建若干个新元素。
1211 0
|
关系型数据库 MySQL Shell
【工具】一款基于go语言的agent
一 介绍      在构建数据库自动化运维系统的时候,数据库服务器上必须要有一个agent来执行web服务器端发起的命令,我们研究了好几种技术Celery,Redis Queue 或者基于socket实现,当然还有自己写,因为之前有同事已经完成了一个agent---servant,在和同事沟通之后,我们决定复用servant,不用重复造轮子。
1748 0