WEB开发网
开发学院软件开发C语言 C# 之不安全代码(2) 阅读

C# 之不安全代码(2)

 2009-06-11 08:31:51 来源:WEB开发网   
核心提示: 固定的和活动的变量&和fixed将变量分为两类:固定的和活动的,固定的变量永久的存在并不会被GC的操作影响,C# 之不安全代码(2),(例如局部变量,值参数和间接指针)活动的变量会被GC重新分配位置或是释放(例如对象中的字段,当转换发生后,当结果指针没有按照正确的指针类型排列的话,基础数据数组),&取固定变量的地址是

固定的和活动的变量

&和fixed将变量分为两类:固定的和活动的。

固定的变量永久的存在并不会被GC的操作影响。(例如局部变量,值参数和间接指针)活动的变量会被GC重新分配位置或是释放(例如对象中的字段,基础数据数组)。

&取固定变量的地址是没有限制的。但是活动变量容易受GC的影响,其地址只能通过fixed来获得,并且地址仅会在整个fixed语句的周期持续有效。

静态字段也是活动变量。还有标记为ref或out的也是活动变量,即使这个参数是传递给固定参数的。最后,通过间接指针引用的变量总是固定变量。

指针转换

在不安全上下文中,下面的转换是隐式的:

l  从任何指针类型到void*

l  从null到任何指针类型

除此之外,下面的转换都是显式的:

l  从任何指针类型到另外的指针类型

l  从sbyte, byte, short, ushort, int, uint, long, or ulong到其他类型

l  从任何类型到sbyte, byte, short, ushort, int, uint, long, or ulong

指针转换并不改变指针的值。也就是说指针转换前后不影响地址的值。

当转换发生后,当结果指针没有按照正确的指针类型排列的话,当访问结果时结果是无法预知的。

下面的例子:

1 char c = 'A';
2 char* pc = &c;
3 void* pv = pc;
4 int* pi = (int*)pv;
5 int i = *pi;        // undefined
6 *pi = 123456;        // undefined
7 

下面的例子会打印出double的8字节的值:

 1 using System;
 2 class Test
 3 {
 4     unsafe static void Main() {
 5       double d = 123.456e23;
 6         unsafe {
 7            byte* pb = (byte*)&d;
 8             for (int i = 0; i < sizeof(double); ++i)
 9                Console.Write("{0:X2} ", *pb++);
10             Console.WriteLine();
11         }
12     }
13 }
14 

1 2 3  下一页

Tags:安全 代码

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接