thread method look lock c# arrays unsafe fixed value-type

method - look en c#



¿Por qué un búfer de tamaño fijo(matrices) debe ser inseguro? (1)

Porque un "buffer fijo" no es una matriz real. Es un tipo de valor personalizado, casi la única forma de generar uno en el lenguaje C # que conozco. No hay forma de que el CLR verifique que la indexación de la matriz se realiza de manera segura. El código tampoco es verificable. La demostración más gráfica de esto:

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

Puede acceder arbitrariamente al marco de pila en este ejemplo. La técnica estándar de inyección de desbordamiento de búfer estaría disponible para el código malicioso para parchear la dirección de retorno de la función y forzar su código para saltar a una ubicación arbitraria.

Sí, eso es bastante inseguro.

Digamos que quiero tener un tipo de valor de 7 bytes (o 3 o 777).

Puedo definirlo así:

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

Una forma más sencilla de definirlo es utilizando un búfer fijo

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

Por supuesto, la segunda definición es más simple. El problema radica en la palabra clave no segura que se debe proporcionar para los búferes fijos. Entiendo que esto se implementa utilizando punteros y, por lo tanto, inseguro.

Mi pregunta es ¿por qué tiene que ser inseguro? ¿Por qué C # no puede proporcionar matrices de longitud constante arbitraria y mantenerlas como un tipo de valor en lugar de convertirla en una matriz de tipo de referencia C # o en buffers inseguros?