《不安全代码》PPT课件.ppt

上传人:小飞机 文档编号:4866234 上传时间:2023-05-20 格式:PPT 页数:26 大小:221KB
返回 下载 相关 举报
《不安全代码》PPT课件.ppt_第1页
第1页 / 共26页
《不安全代码》PPT课件.ppt_第2页
第2页 / 共26页
《不安全代码》PPT课件.ppt_第3页
第3页 / 共26页
《不安全代码》PPT课件.ppt_第4页
第4页 / 共26页
《不安全代码》PPT课件.ppt_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《《不安全代码》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《不安全代码》PPT课件.ppt(26页珍藏版)》请在三一办公上搜索。

1、第16章 不安全代码,(时间:1次课,2学时),第16章 不安全代码,前面各章节介绍的C#源程序都是在公共语言运行时CLR的管理下执行的代码,它们都是受控代码,C#语言不允许在受控代码中使用指针(而指针恰恰就是带来不安全的根源),所以C#受控代码又称为安全代码,而使用指针的代码就称为不安全代码。本章重点介绍如何组成C#源程序的不安全代码块以及在不安全代码中定义和使用指针的方法。本章教学目的:掌握指针和不安全代码的概念掌握指针的使用掌握C#中不安全代码的使用机制和实现方法,第16章 不安全代码,16.1 不安全代码 16.2 不安全的代码块 16.3 C#程序中的指针,16.1 不安全代码,由于

2、受控代码中不允许使用指针,所以它是安全的,这对我们的大多数应用程序都是有益的。但是,在某些情况下我们必须使用指针,例如,调用底层操作系统、访问内存映射驱动器(属于系统级的应用)以及执行对时间有严格要求的算法等。为了能在一定的应用中使用指针,C#语言引入了不安全代码(unsafe code)的概念,并提供了创建和使用不安全代码的模式。指针是C/C+语言的一个重要概念,也是其重要的特色之一。熟悉C/C+的人都知道指针就是变量的内存地址,所以常把变量的地址称为变量的指针,而把存放地址的变量叫做指针变量。因此,指针有点像C#中的引用,但它们是有区别的:指针可以指向任何内存空间,但引用只能指向某个类的对

3、象。正因为指针可以指向任何内存空间,所以有可能会被滥用,这就是为什么创建C#的受控代码时,不允许使用指针的原因所在。C#允许创建和使用指针,但对指针的使用限制很多,将创建和使用指针的代码称为不安全代码,而且这种不安全代码不在CLR的控制下执行,所以又称为非受控代码。在C#语言中要使用指针,首先必须组成C#不安全代码模块(使用关键字unsafe和fixed),然后才能在C#不安全代码中定义和使用指针(和在C/C+中使用指针的方法一样)。现在我们知道C#语言的源程序有两种运行模式:“安全”模式和“不安全”模式。在前面各章节中介绍的例子都是运行在安全模式下的,这也是C#语言默认的运行方式。本章将介绍

4、的是C#不安全运行模式。需要强调的是,C#语言主要是创建受控代码的,它支持非受控代码的能力只是使它可以用来解决一些特殊的应用问题,而这并不是标准的C#程序。,16.2 不安全的代码块,16.2.1 指针 16.2.2 unsafe关键字 16.2.3 fixed语句,16.2 不安全的代码块,如果我们的应用问题需要使用指针,则在使用C#语言编程时就需要先定义一个不安全代码块,在代码块中才能使用指针。,16.2.1 指针,在介绍不安全代码块之前,先简单介绍(或复习)指针的概念。1.定义指针变量指针变量就是存放对象地址的变量。比如,变量x保存了变量y的地址,那么就说变量x是指针变量,或者说x指向y

5、。定义指针变量的语句格式为:数据类型*变量名;,16.2.1 指针,2.给指针变量赋值上述定义ip为指针变量,表示ip将用来保存某个整型变量的内存地址,这个地址就是该变量在计算机内存中的位置。那么如何给指针变量ip赋一个地址(又叫指针值)呢?给指针变量赋值要用“&”运算符,这是“取地址”运算符。,16.2.2 unsafe关键字,如果我们想要在C#语言的源程序中使用指针,则必须在相应的类、结构、接口或代理的定义中使用unsafe修饰符,或者在语句中使用unsafe关键字以指定能使用指针的代码区域“不安全”代码或“非保护”代码。,16.2.2 unsafe关键字,【例16.1】使用不安全代码。u

6、sing System;public class UnsafeCodeunsafe static void MultiMethod(double*dp)/MultiMethod方法中可以使用指针*dp*=2;/dp为指针变量,用于执行乘法赋值运算public unsafe static void Main()/Main()方法中可以使用变量的指针double x=10;MultiMethod(程序运行结果:20,16.2.2 unsafe关键字,在上例中,使用指针变量作为方法的形参,则在调用方法时传递的是变量的地址而不是数值;而如果将方法MultiMethod改为不使用指针变量作为形参,则调用

7、方法之后变量x的数值是不会变为20的,仍然为10。在上例中不论是使用指针的主方法,还是利用指针变量进行计算的方法,MultiMethod的定义中都使用了unsafe修饰符。现在我们把主方法代码改写如下:public static void Main()double x=10;unsafe MultiMethod(,16.2.3 fixed语句,.NET框架的公共语言运行时CLR环境提供了“自动管理内存”的功能(垃圾回收器),我们在程序设计中只需定义变量(系统根据此变量自动分配内存),而无需关心在程序的功能执行完后,如何来释放被变量占用的内存,CLR环境会不定期地对程序所使用的内存进行管理,自动

8、释放无用变量占用的内存。但是,我们不知道这种“自动内存管理”在程序的执行过程中何时发生,而有时我们不希望被某个指针变量引用的变量被这种自动内存管理“自动处理”掉(移动或回收),这时在程序中就需要对这个指针变量使用fixed关键字加以声明,目的是通知系统,该指针变量所指向的变量不能按“自动管理内存”的方式处理。fixed语句主要用来防止系统进行“自动内存管理”时移动或释放被某个指针变量所指向的变量。语句格式如下:fixed(数据类型*指针变量=&变量)/使用存储位置固定的对象/代码,16.2.3 fixed语句,【例16.2】使用fixed语句。using System;public class

9、 Point public int a,b;class FixedCodeunsafe static void SquareMethod(int*ip)/不安全方法*ip*=*ip;public static void Main()Point pt=new Point();pt.a=10;pt.b=12;unsafe/指定不安全代码,fixed只能用在unsafe声明的范围内fixed(int*p=程序运行结果:(100,12),16.3 C#程序中的指针,16.3.1 用指针访问对象 16.3.2 指针运算,16.3 C#程序中的指针,在上两节中,主要介绍了在C#语言程序中如何解决使用指针的

10、问题。要想在C#中使用指针,必须把含有指针运算等有关的类、方法等语句块用unsafe和fixed模块圈定起来,使代码成为不安全代码。而有关不安全代码中指针的使用与C/C+语言中的基本类似,以下再对指针在C#中的使用方法进行说明和复习(对掌握C/C+的程序员)。,16.3.1 用指针访问对象,1.指向数组的指针 使用指针引用数组元素就如同使用数组的下标引用数组元素一样方便。,16.3.1 用指针访问对象,【例16.3】指向数组的指针。using System;public class Testpublic static int array1=new int 0,1,2,3,4,5,6,7,8,9

11、,;/定义一个数组public static int,array2=new int,1,2,3,4,5,6,7,8,9,10,11,12;public unsafe static void Main()/使用不安全代码fixed(int*py=,16.3.1 用指针访问对象,Console.WriteLine();Console.WriteLine();fixed(int*py=程序运行结果:0 1 2 13 14 5 6 7 8 9 1 2 3 4 5 6 7 8 19 20 21,16.3.1 用指针访问对象,在C#语言中同样也有指针数组,就是由指针组成的数组。例如以下代码中定义了一个指针

12、数组:int a=1;int b=2;int*array=new int*3;array0=/将变量a的地址存入指针数组的第二个元素中,16.3.1 用指针访问对象,2.指向结构体的指针在C#的不安全代码中指针还可以指向一个结构体。指向结构体的指针确切地说是指向结构对象的指针。我们可以通过-运算符来访问结构成员,例如,p是一个指向结构对象s的指针变量,m是结构对象s的成员,则用指针p访问m的格式为:p-m,这相当于s.m。,16.3.1 用指针访问对象,【例16.4】使用结构体对象指针。using System;public struct Point/表示平面中的点public int x,y

13、;public Point(int x,int y)/构造函数this.x=x;this.y=y;public struct Rectangle/描述矩形的结构public Point p1;public Point p2;public Rectangle(Point p1,Point p2)/构造函数this.p1.x=p1.x;this.p1.y=p1.y;this.p2.x=p2.x;this.p2.y=p2.y;,16.3.1 用指针访问对象,public int Area()/求矩形面积的方法return(p2.x-p1.x)*(p2.y-p1.y);public class App

14、public unsafe static void Main()/创建点对象Point p1=new Point(1,1);Point p2=new Point(10,10);/创建矩形对象Rectangle r1=new Rectangle(p1,p2);Console.WriteLine(r1.Area();Rectangle*r=/使用指针来访问结构的成员要使用运算符“-”,而不是“.”程序运行结果为:819801,16.3.2 指针运算,1.指针的算术运算可以在指针上使用+、-、+和-运算来递增和递减指针的值,这也就是改变地址值;还可以使用=、!=、=等比较运算符,对两个指针的值(地址

15、)进行比较,例如,设p1、p2为指针变量:if(p1!=p2)if(p1p2),16.3.2 指针运算,2.sizeof运算符sizeof运算符只能在不安全代码中使用,其用法与C/C+中一样。使用这个运算符可以获得某种数据类型在内存中所占用的字节数。使用格式为:sizeof(数据类型)其中:数据类型包括各种数值类型、结构和枚举等,不包括引用类型。sizeof运算后的返回值为一个整数值,它表示“数据类型”所占用的字节数。例如:sizeof(int)=4 sizeof(double)=8 要注意的是,在C/C+语言中,sizeof运算符可以获得各种数据类型的变量、数组等占据内存的字节数。但在C#语

16、言中,sizeof运算符只能对数值类型的变量进行运算,而sizeof(string)在C#中就是非法的。,16.3.2 指针运算,3.stackalloc运算符在C#的不安全代码中,还可以使用stackalloc运算符在栈中为变量分配内存,其作用类似于new运算符。stackalloc运算符的使用格式为:数据类型*指针变量=stackalloc 数据类型表达式其中:数据类型包括各种数值类型、结构和枚举等,不包括引用类型。指针变量是C#合法的标识符。stackalloc运算符后的数据类型必须与前面的数据类型一致。内的表达式是一个通过运算可以获得整数类型数据的表达式,表达式的计算结果表示待分配内存的元素个数。例如:char*ct=stackalloc char10;这条语句表示在栈中将分配一个存储10个字符的内存空间,并将该内存空间的首地址赋给指针变量ct。需要说明的是,用户无法显式地释放使用stackalloc运算符分配的内存,这些内存会在方法返回后被自动释放。如果使用stackalloc运算符分配内存时没有足够的内存,则系统会抛出一个System.StackOverflowException异常。,Q&A?Thanks!,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号