Создание компилятора языка для .NET Framework - Средства устранения ошибок в IL

ОГЛАВЛЕНИЕ

Средства устранения ошибок в IL

Даже самые испытанные эксперты по компиляторам делают ошибки на уровне создания кода. Самой частой ошибкой является ошибочный код IL, вызывающий дисбаланс в стеке. CLR обычно выдает исключение при обнаружении ошибочного IL (либо при загрузке сборки , либо при JITed (?) IL, в зависимости от уровня доверия сборки). Эти ошибки несложно диагностировать и исправить при помощи простого средства SDK, именуемого peverify.exe. Оно выполняет проверку IL, убеждаясь в том, что код безошибочен и безопасен для исполнения.

Для примера, ниже приведен код IL, пытающийся добавить число 10 к строке "bad":

ldc.i4    10
ldstr    "bad"
add

Выполнение peverify на сборке, содержащий этот ошибочный IL приведет к следующей ошибке:

[IL]: Error: [C:\MSDNMagazine\Sample.exe : Sample::Main][offset 0x0000002][found ref 'System
.String'] Expected numeric type on the stack.

В данном примере, peverify сообщает, что инструкция сложения ожидала два числовых типа, но вместо этого обнаружила целое число и строку.

ILASM (ассемблер IL) и ILDASM (дизассемблер IL) – два средства SDK, которые можно использовать для компиляции текста IL в сборки .NET и декомпиляции сборок в IL, соответственно. ILASM позволяет быстро и просто тестировать потоки инструкций IL, которые будут основой выходящих данных компилятора. Достаточно создать код IL в текстовом редакторе и передать его ILASM. В то же время, средство ILDASM может быстро заглянуть в созданный компилятором IL, чтобы найти конкретный путь кода. Это включает IL, выдаваемый коммерческими компиляторами, такими как компилятор C#. Оно предлагает отличный способ просмотра кода IL для похожих операторов в разных языках; другими словами, код контроль потока IL, созданный для цикла C# , может быть использован другими компиляторами, имеющими подобные конструкции.