Опубликован: 28.06.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный технический университет им. Н.Э. Баумана
Лекция 8:

Анализ кода на 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". Передачи управления между инструкциями показаны стрелками.

Граф потока управления для метода print

Рис. 4.1. Граф потока управления для метода print

Любопытно, что инструкция безусловного перехода br.s на графе отсутствует. Действительно, она не несет никакого смысла и нужна только для кодирования тела метода в виде линейной последовательности инструкций.

Количество дуг, исходящих из узла графа, зависит от записанной в нем инструкции. Это видно на примере инструкции blt.s, из которой исходит сразу две дуги. Дуга, помеченная числом 1, обозначает передачу управления в случае истинности проверяемого инструкцией blt.s условия.

В случае ложности условия передача управления осуществляется по дуге, помеченной числом 0.

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

Таблица 4.1. Варианты нумерации дуг графа
Вариант нумерации Количество дуг Семантика
Нумерация для инструкции switch Любое Дуга с номером 0 обозначает передачу управления, которая происходит при "неудаче" (когда ни один из случаев, перечисленных в инструкции switch, не получил управления).

Если в инструкции switch записано N переходов, то передачи управления для этих переходов обозначают дугами с номерами от 1 до N

Нумерация для инструкции условного перехода 2 Дуги с номерами 0 и 1 обозначают соответственно false-ветку и true-ветку условного перехода
Нумерация для последовательных инструкций 1 Дуга с номером 0 обозначает передачу управления на следующую инструкцию
Нумерация для "тупиковых" инструкций 0 Из узлов, которые соответствуют некоторым инструкциям, связанным с выходом из блока ( throw, rethrow, endfinally, endfilter, ret ), вообще не исходит дуг
Анастасия Булинкова
Анастасия Булинкова
Рабочим названием платформы .NET было
Bogdan Drumov
Bogdan Drumov
Молдова, Республика
Azamat Nurmanbetov
Azamat Nurmanbetov
Киргизия, Bishkek