首页 > 其他分享 >2.7 控制与数据的结合

2.7 控制与数据的结合

时间:2023-05-25 09:55:14浏览次数:35  
标签:控制 int 代码 地址 结合 引用 类型 2.7 指针

理解指针

每一个指针都对应一个类型。这个类型表明该指针指向哪一类对象。如果对象类型为T,那么指针类型为T*,特殊的void *类型代表通用指针。

每一个指针都有一个值。这个值时某个指定类型的对象的地址。

指针用‘&’运算符创建。这个运算符可以应用到任何lvalue类的C表达式上,lvalue意指可以出现在赋值语句左边的表达式。这样的例子包括变量以及结构、联合和数组的元素。我们已经看到,因为leaq指令是设计用来计算内存引用的地址的,&运算符的机器代码实现常常用这条指令来计算表达式的值。

*操作符用于间接引用指针。其结果是一个值,它的类型与该指针的类型一致。间接引用是用内存引用来实现的,要么是存储到一个指定的地址,要么是从指定的地址读取。

数组与指针紧密联系。一个数组的名字可以像一个指针变量一样引用(但是不能修改)。数组引用(例如a[3])与指针运算和间接引用(例如*(a+ 3))有一样的效果。数组引用和指针运算都需要用对象大小对偏移量进行伸缩。当我们写表达式p+i,这里指针p的值为p,得到的地址计算为p+L·i,这里L是与p相关联的数据类型的大小。

将指针从一种类型强制转换成另一种类型,只改变它的类型,而不改变它的值。强制类型转换的一个效果是改变指针运算的伸缩。

指针也可以指向函数。例如,如果我们有一个函数,用下面这个原型定义:

int fun(int x, int *p);

然后,我们可以声明一个指针fp,将它赋值为这个函数,代码如下:

int (*fp)(int, int *);

fp=fun;

然后用这个指针来调用这个函数:

int y=1;

int result =fp(3, &y);

函数指针的值是该函数机器代码表示中第一条指令的地址。

内存越界引用与缓冲区溢出

对越界的数组元素的写操作会破坏存储在栈中的状态信息,当程序试图重新加载寄存器或执行ret指令时,就会出现严重的错误。如果访问越界了,返回指针的值以及更多的保存状态就会被破坏,那么程序就可能返回到意想不到的地址。

 对抗缓冲区溢出攻击

1.栈随机化。为了在系统中插入攻击代码,攻击者要插入这段代码的指针,而产生这个指针需要知道这段代码放置的栈地址。栈随机化的思想使得栈的位置在程序每次运行时都有变化。因此,即使许多机器都运行同样代码,他们的栈地址是不同的。实现的方式是,在程序开始时在栈上分配一段随机大小的空间,程序不使用这段空间,但会导致程序每次执行时后续栈位置发生变化。

2.栈破坏检测。思想是在栈帧中任何局部缓冲区与栈状态直接存储一个哨兵值,在程序每次运行时随机产生并标志为可读,在恢复寄存器状态和函数返回之前,程序检查这个哨兵值是否改变,如果改变程序将异常终止。

3.限制可执行代码区域。只有保存编译器产生的代码那部分内存才需要是可执行的,消除攻击者向系统插入可执行代码的能力

标签:控制,int,代码,地址,结合,引用,类型,2.7,指针
From: https://www.cnblogs.com/LCAB/p/17420684.html

相关文章

  • 【转载】Mybatis Plus QueryWrapper结合lambda表达式使用distinct的方法
    MybatisPlusQueryWrapper的lambda用起来感觉挺爽的,有点JPA的感觉,也不需要拼很多字符串,可以利用IDE的代码检查功能,总之好处多多,停不下来。最近遇到一个问题,需要对SQL查询的结果做去重处理,自然想到了使用distinct。对于复杂的SQL语句,一般使用自定义XML的方式,但是这么个小问题,XML......
  • 变量、流程控制与游标
    变量、流程控制与游标作者:FL博客:https://www.cnblogs.com/flblogs/注意:本笔记部分参考尚硅谷-宋红康1.变量MySQL中的变量是一种可以在SQL语句中动态存储和传递数据的机制。与其他编程语言类似,在MySQL数据库中,变量分为系统变量以及用户自定义变量。常量:字符串常量......
  • 成本控制域CN01和8000有不同的元素业务
    如果需分配编号的成本要素在界面中缺失,可采用T-CODE:SE38执行RKTKA04C程序进行处理。   ......
  • R : 生成一个堆叠图用于展示OTU在不同分类水平上的相对丰度,并结合一个聚类树进行可视
    setwd("E:\\中国农业科学院\\20220927宏基因组教学\\02后期分析\\01堆叠图")rm(list=ls())library(tidyverse)library(ggplot2)library(ggtree)library(treeio)library(ggsci)library(cowplot)otu=read.table('top10.2.txt',row.names=1,sep='\t'......
  • C++拷贝控制技术
    模板特例如何写忘了拷贝noexcept 如果可以确认不会抛出异常,交换两个指针就行了swap是命名空间里的某个,更改的时候需要加上该命名空间 特例函数怎么写,就这样。inline的位置值得注意"=”运算符重载 两种拷贝一致 不可拷贝的方式编译器会想方设法为我们......
  • Pelco-D控制协议
    1、通令参数:标准速率为4800bps,无校验, 8位数据位,1位停止位2、命令串格式:一个PTZ控制命令为7字节的十六进制代码,格式如下:Word 1Word2Word3Word4Word5Word6Word7同步字节地址Command 1Command(指令码) 2Data(数据) 1Data2......
  • CSS:页面美化和布局控制和选择器
    CSS:页面美化和布局控制和选择器概念:CascadingStyleSheets层叠样式表层叠:多个样式可以作用在同一个html的元素上,同时生效好处:功能强大将内容展示和样式控制分离降低耦合度。解耦让分工协作更容易提高开发效率CSS的使用:CSS与html结合方式内联样式在标签内使用style属......
  • 【JavaScript用法】JavaScript(JS)的基本语法(JS数据类型,JS变量,JS运算符,JS流程控制语句
    JavaScript(JS)的基本语法目录JavaScript(JS)的基本语法一.与html结合方式二.注释三.数据类型:四.变量五.运算符(和Java有点类似)六.流程控制语句(和JAVA 类似):七.JS特殊语法:一.与html结合方式       1.内部JS:定义<script>,标签体内容就是js代码(可以理解为和html......
  • 会话控制
    会话控制1、介绍所谓会话控制,就是对会话进行控制。HTTP是一种无状态协议,它没有办法区分多次请求是否来自同一个客户端,无法区别用户。而产品中又大量存在这样的需求,所以我们需要通过会话控制来解决这个问题。常见的会话控制技术有三种:cookiesessiontoken2、cookie2.1、......
  • 记录--按钮级别权限怎么控制
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助最近的面试中有一个面试官问我按钮级别的权限怎么控制,我说直接v-if啊,他说不够好,我说我们项目中按钮级别的权限控制情况不多,所以v-if就够了,他说不够通用,最后他对我的评价是做过很多东西,但是都不够深入,好吧,那今天我们......