О каком компиляторе вы говорите? Компилятор C # или JITer?
кнулся на этот код:
static void Main()
{
typeof(string).GetField("Empty").SetValue(null, "evil");//from DailyWTF
Console.WriteLine(String.Empty);//check
//how does it behave?
if ("evil" == String.Empty) Console.WriteLine("equal");
//output:
//evil
//equal
}
и мне интересно, как вообще возможно скомпилировать этот кусок кода. Я рассуждаю так:
По данным MSDNString.Empty
только для чтения, поэтому изменение должно быть невозможным, а компиляция должна заканчиваться «Статическое поле только для чтения» или аналогичная ошибка.
Я думал, что сборки библиотеки базовых классов каким-то образом защищены и подписаны, и это точно не предотвращает подобные атаки. В следующий раз кто-то может изменить System.Security.Cryptography или другой критический класс.
Я думал, что сборки библиотеки базовых классов компилируются NGEN после установки .NET, поэтому изменение полей класса String должно требовать расширенного взлома и быть намного сложнее.
И все же этот код компилируется и работает. Может кто-нибудь объяснить, что не так с моими рассуждениями?