29

7バイト(または3または777)の値型が必要だとします。

私はそれを次のように定義することができます:

public struct Buffer71
{
    public byte b0;
    public byte b1;
    public byte b2;
    public byte b3;
    public byte b4;
    public byte b5;
    public byte b6;
}

それを定義するより簡単な方法は、固定バッファーを使用することです

public struct Buffer72
{
    public unsafe fixed byte bs[7];
}

もちろん、2番目の定義はもっと簡単です。問題は、固定バッファーに提供する必要のある安全でないキーワードにあります。これはポインタを使用して実装されているため、安全ではないことを理解しています。

私の質問は、なぜそれが安全でなくてはならないのかということです。C#が任意の定数長配列を提供し、C#参照型配列または安全でないバッファーにするのではなく、それらを値型として保持できないのはなぜですか?

4

1 に答える 1

12

「固定バッファ」は実際の配列ではないためです。これはカスタム値型であり、私が知っているC#言語で生成する唯一の方法です。アレイのインデックス作成が安全な方法で行われていることをCLRが確認する方法はありません。コードも検証できません。これの最もグラフィックなデモンストレーション:

using System;

class Program {
    static unsafe void Main(string[] args) {
        var buf = new Buffer72();
        Console.WriteLine(buf.bs[8]);
        Console.ReadLine();
    }
}
public struct Buffer72 {
    public unsafe fixed byte bs[7];
}

この例では、スタックフレームに任意にアクセスできます。悪意のあるコードは、標準のバッファオーバーフローインジェクション手法を使用して、関数のリターンアドレスにパッチを適用し、コードを任意の場所にジャンプさせることができます。

はい、それはかなり危険です。

于 2010-05-21T11:39:03.413 に答える