Domanda

dire Let voglio avere un tipo di valore di 7 byte (o 3 o 777).

posso definirlo così:

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

Un modo semplice per definire che usa una buffer fisso

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

Naturalmente la seconda definizione è più semplice. Le bugie problema con la parola pericoloso che deve essere fornita per i buffer fissi. Capisco che questo è implementato utilizzando puntatori e quindi pericoloso.

La mia domanda è perché ha a essere pericoloso? Perché C # non possono fornire matrici lunghezza costante arbitraria e tenere come un tipo di valore invece di renderlo un C # riferimento di tipo matrice o insicuri buffer?

È stato utile?

Soluzione

Poiché un "buffer fisso" non è un array reale. Si tratta di un tipo di valore personalizzato, l'unico modo per generare uno nel linguaggio C #, che io sappia. Non v'è alcun modo per il CLR per verificare che l'indicizzazione della matrice è fatto in modo sicuro. Il codice non è verificabile sia. La dimostrazione più grafica di questo:

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];
}

È possibile accedere arbitrariamente lo stack frame in questo esempio. La tecnica di iniezione di buffer overflow standard sarebbe disponibile a codice dannoso per rattoppare l'indirizzo di ritorno della funzione e forzare il codice per passare a una posizione arbitraria.

Sì, che è abbastanza pericoloso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top