网络安全

位置:IT落伍者 >> 网络安全 >> 浏览文章

C#之不安全代码(1)


发布日期:2023年07月05日
 
C#之不安全代码(1)

主要参考的是C# Language Specification Version

引子

C#是Net平台上主流的开发语言和经典的C/C++不同的是C#所编写的代码是托管代码由GC来管理内存省去了new/delete的烦恼但是由于某些特殊的要求比如和底层的操作系统接口访问内存映射设备或者实现对时间要求苛刻的算法时C#提供了不安全代码

不安全上下文

不安全代码只能写在不安全上下文中

通过unsafe 修饰符可以修饰

class struct interface or delegate

field method property event indexer operator instance constructor destructor or static constructor

unsafestatementblock

指针的类型

在不安全上下文中指针类型和引用类型或是值类型一样但是指针类型可以用在不安全上下文之外的typeof中虽然这么做不安全

Type t = typeof(Int*)返回的是SystemInt*

指针类型是用非托管类型或是void加上*来表示的

pointertype:

unmanagedtype *

void *

unmanagedtype:

type

在*前面的指针类型被称为指针类型的引用类型它表明了指针变量的值指向的变量的类型

非托管类型不是引用类型也不包含任何嵌套的引用类型的成员

非托管类型就是下面的一种

sbyte byte short ushort int uint long ulong char float double decimal or bool

Any enumtype

Any pointertype

Any userdefined structtype that contains fields of unmanagedtypes only

例子

ExampleDescriptionbyte*Pointer to bytechar*Pointer to charint**Pointer to pointer to intint*[]Singledimensional array of pointers to intvoid*Pointer to unknown type

和C/C++不同的是声明多个指针变量需要

int *p*p

但是在C#中int* pp就声明了两个指针变量并且*是在类型之后不是在变量名之前

和引用类型相同的是指针可以为null(所有位为如果访问一个指向null的指针会引发不可预知的结果

Void* 表示一个指针指向未知类型因为指向未知类型所以不能通过*来访为指向的变量也不能对指针进行数学运算但是void*可以转换为任何指针类型反之亦然

指针类型是一个单独的类型指针类型不是继承自SystemObject并且两者也不能互相转换同样装箱和拆箱也不适合指针类型但是不同类型指针之间可以互相转换

指针类型不能用于类型参数当泛型方法的类型参数为指针类型会调用失败

指针类型还可用于易变字段类型

虽然指针还能通过ref和out来传递但是会造成不可预知的行为当指针指向一个已经不存在的本地变量或是指向一个实际不再固定的固定对象比如

using System;

class Test

{

static int value = ;

unsafe static void F(out int* pi ref int* pi) {

int i = ;

pi = &i;

fixed (int* pj = &value) {

//

pi = pj;

}

}

static void Main() {

int i = ;

unsafe {

int* px;

int* px = &i;

F(out px ref px);

ConsoleWriteLine(*px = {} *px = {}

*px *px); // undefined behavior

}

}

}

方法可以返回指针类型

unsafe static int* Find(int* pi int size int value) {

for (int i = ; i < size; ++i) {

if (*pi == value)

return pi;

++pi;

}

return null;

}

主要有几个操作符

· *被用作间接访问

· >被用作通过指针来访为结构的成员

· []用来做指针的索引器

· &用来获得变量的地址

· ++和—用来自增和自减指针

· +和用来做指针的算术运算

· == != < > <= and =>用来比较指针

· stackalloc可以从栈上分配内存

· fixed用来临时固定一个变量所以它的地址总是可以得到的

               

上一篇:ASP中存在的安全问题

下一篇:C#中的非安全编程