Ответ 1
Потому что "фиксированный буфер" не является реальным массивом. Это настраиваемый тип значения, единственный способ генерировать его на языке С#, который я знаю. 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];
}
В этом примере вы можете произвольно получить доступ к фрейму стека. Стандартный метод переполнения буфера будет доступен для вредоносного кода для исправления адреса возврата функции и принудительного перехода вашего кода в произвольное местоположение.
Да, это совершенно небезопасно.