Рабочим названием платформы .NET было |
Анализ кода на CIL
Основные элементы графа потока управления
Граф потока управления - это ориентированный граф, узлы которого соответствуют инструкциям CIL, а дуги изображают передачу управления между инструкциями.
В качестве примера рассмотрим фрагмент программы на CIL:
.method private static void print(int32[] X) { .locals init (int32 i) ldc.i4.0 stloc.0 br.s loop_cond loop_body: ldarg.0 ldloc.0 ldelem.i4 call void System.Console::WriteLine(int32) ldloc.0 ldc.i4.1 add stloc.0 loop_cond: ldloc.0 ldarg.0 ldlen conv.i4 blt.s loop_body ret }
Граф потока управления для приведенного в примере метода изображен на рис. 4.1. Узлы графа обозначены прямоугольниками, в которых записаны инструкции CIL. Точка входа в метод обозначена специальным узлом с меткой "Метод print". Передачи управления между инструкциями показаны стрелками.
Любопытно, что инструкция безусловного перехода br.s на графе отсутствует. Действительно, она не несет никакого смысла и нужна только для кодирования тела метода в виде линейной последовательности инструкций.
Количество дуг, исходящих из узла графа, зависит от записанной в нем инструкции. Это видно на примере инструкции blt.s, из которой исходит сразу две дуги. Дуга, помеченная числом 1, обозначает передачу управления в случае истинности проверяемого инструкцией blt.s условия.
В случае ложности условия передача управления осуществляется по дуге, помеченной числом 0.
Вообще, имеет смысл нумеровать дуги, исходящие из узла графа. При этом номер дуги должен задавать ее семантику. Всего можно выделить четыре варианта нумерации дуг графа. Эти варианты представлены в таблице 4.1.