En an answer en su propio controversial question, Mash ha demostrado que no necesita la palabra clave "inseguro" para leer y escribir directamente en los bytes de cualquier instancia de objeto .NET. Puede declarar los siguientes tipos:¿Por qué este código funciona sin la palabra clave insegura?
[StructLayout(LayoutKind.Explicit)]
struct MemoryAccess
{
[FieldOffset(0)]
public object Object;
[FieldOffset(0)]
public TopBytes Bytes;
}
class TopBytes
{
public byte b0;
public byte b1;
public byte b2;
public byte b3;
public byte b4;
public byte b5;
public byte b6;
public byte b7;
public byte b8;
public byte b9;
public byte b10;
public byte b11;
public byte b12;
public byte b13;
public byte b14;
public byte b15;
}
Y luego puede hacer cosas como cambiar una cadena "inmutable". Los siguientes código imprime "bar" en mi máquina:
string foo = "foo";
MemoryAccess mem = new MemoryAccess();
mem.Object = foo;
mem.Bytes.b8 = (byte)'b';
mem.Bytes.b10 = (byte)'a';
mem.Bytes.b12 = (byte)'r';
Console.WriteLine(foo);
También pueden desencadenar un AccessViolationException corrompiendo las referencias a objetos con la misma técnica.
Pregunta: Pensé que (en el código C# administrado puro) la palabra clave unsafe era necesaria para hacer cosas como esta. ¿Por qué no es necesario aquí? ¿Esto significa que el código "seguro" gestionado puro no es realmente seguro en absoluto?
Gracias por cambiar la forma de hacer la misma pregunta. El hilo anterior estaba demasiado inflamado. – Mash
@Mash: No hay problema. Con suerte, esto dirigirá una atención más positiva a su pregunta original. –
@wcoenen: No es importante, realmente, incluso si estaba pensando en ello, mi pregunta es contenido de la comunidad y no estoy ganando nada de eso. Entonces, lo único importante es una discusión positiva. Y parece que tu pregunta se ve mejor :) – Mash