О каком компиляторе вы говорите? Компилятор 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 должно требовать расширенного взлома и быть намного сложнее.

И все же этот код компилируется и работает. Может кто-нибудь объяснить, что не так с моими рассуждениями?

Ответы на вопрос(0)

Ваш ответ на вопрос