此代码中的不安全内容

本文关键字:不安全 代码 | 更新日期: 2023-09-27 18:00:12

我正在学习CLR中的托管代码和非托管代码。所以我用C#中的C风格指针写了这个例子:

unsafe  static void Main(string[] args)
{
    int x;
    int* y;
    y = &x;
    *y = 50;
    Console.WriteLine(*y);
    Console.WriteLine(((int)y).ToString());
}

所以我想知道我从上面的代码中得到的IL代码中真正不安全的是什么?

.assembly extern mscorlib
{}
.assembly UnsafePointers
{}
.module UnsafePointers.exe
.class private auto ansi beforefieldinit UnsafePointers.Program
extends [mscorlib]System.Object
{
    .method private hidebysig static void  Main(string[] args) cil managed
    {
        .entrypoint
        // Code size       34 (0x22)
        .locals init (int32 x,
        int32* y)
        IL_0001:  ldloca     x
        IL_0003:  conv.u
        IL_0004:  stloc      y
        IL_0005:  ldloc  y 
        IL_0006:  ldc.i4   50
        IL_0008:  stind.i4
        IL_0009:  ldloc      y
        IL_000a:  ldind.i4
        IL_000b:  call       void [mscorlib]System.Console::WriteLine(int32)
        IL_0010:  nop
        IL_0011:  ldloca     y
        IL_0012:  conv.i4
        IL_0016:  call       instance string [mscorlib]System.Int32::ToString()
        IL_001b:  call       void [mscorlib]System.Console::WriteLine(string)
        IL_0021:  ret
    } 
}    

CLR是否管理此代码?上面的代码会出什么问题?

此代码中的不安全内容

使此代码不安全的是使用了'ldin.i4'语句。这将从内存地址加载一个带符号的4字节整数。可以给定任何内存地址,允许您在当前进程中读取任何内存地址。这被认为是不安全和无法核实的。例如,您可以使用它来查看其他应用程序域内部,这是不允许的。

它被称为不安全,部分原因是它没有被管理。

你可以很容易地创建c++风格的内存泄漏,没有边界检查,以及其他问题。。。

一篇关于不安全代码的好文章,也列出了一些风险:

在C#中使用不安全代码

不安全可能并不意味着危险,但在不安全代码中有一件事很重要:它是不可验证的。这可能意味着一些事情,比如不检查数组的边界。在你的简单例子中。它没有那么危险或可怕。它很直接。

In可能不安全,因为它还绕过了.NET Framework中的大多数安全机制;这就是为什么不安全的代码无论如何都需要完全信任。

不安全!=未管理。不安全只是意味着它可以操纵指针。

通常,unsafe关键字允许您直接访问内存,因此可以绕过CLR的所有验证和安全检查。

以下是一篇关于unsafe代码的使用和影响的好文章:http://blogs.msdn.com/b/sebby1234/archive/2006/04/05/565090.aspx

默认情况下,Microsoft的C#和Visual Basic.NET编译器生成"安全"代码。安全代码是可验证的安全代码。但是,使用C#的unsafe关键字或使用其他语言(如带有托管扩展的C++或IL汇编语言),可以生成无法验证安全的代码。也就是说,代码实际上可能是安全的,但验证无法证明这一点

管理员可以选择关闭验证(使用".NET管理"Microsoft管理控制台管理单元)。在验证关闭的情况下,JIT编译器将把不可验证的IL编译成本机CPU指令;但是,管理员对代码的行为承担全部责任。