8

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 はこのコードを管理しますか? そして、上記のコードで何が問題になる可能性がありますか?

4

5 に答える 5

6

管理されていないこともあり、安全ではないと言われています。

C ++スタイルのメモリリークを簡単に作成でき、境界チェックやその他の問題はありません...

安全でないコードに関するすばらしい記事には、いくつかのリスクも記載されています。

C#での安全でないコードの使用

于 2011-06-24T18:01:43.383 に答える
6

このコードを危険にさらしているのは、「ldind.i4」ステートメントの使用です。これは、メモリ アドレスから符号付き 4 バイト整数をロードします。任意のメモリ アドレスを指定できるため、現在のプロセスの任意のメモリ アドレスから読み取ることができます。これは安全ではなく、検証不能と見なされます。たとえば、これを使用して、許可されていない他のアプリ ドメイン内を調べることができます。

于 2011-07-27T15:03:42.237 に答える
5

Unsafe は危険を意味しないかもしれませんが、unsafe コードで重要なことが 1 つあります。それはunverifiableです。これは、配列の境界をチェックしないなど、いくつかのことを意味する場合があります。あなたの簡単な例では。それほど危険でも恐ろしいことでもありません。それはかなり簡単です。

In は、.NET Framework のほとんどのセキュリティ メカニズムを回避するため、安全ではない可能性があります。安全でないコードには完全な信頼が必要なのはこのためです。

安全でない != 管理されていません。安全でないということは、ポインターを操作できることを意味します。

于 2011-06-24T18:08:38.427 に答える
3

一般に、このunsafeキーワードを使用すると、メモリに直接アクセスできるため、CLRによるすべての検証と安全性チェックがバイパスされます。

unsafeコード の使用と影響に関する優れた記事は次のとおりです。http: //blogs.msdn.com/b/sebby1234/archive/2006/04/05/565090.aspx

于 2011-06-24T18:08:20.287 に答える