Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 74 стр.

UptoLike

кватного представления блоков обработки исключений нам придется до-
бавить в граф потока управления специальные узлы, обозначающие входы
в блоки, а также специальные дуги, отражающие взаимосвязи между ни-
ми. Кроме того, мы обобщим понятие блока, введя так называемый блок
тела метода.
Блоки, представленные в графе потока управления, можно разделить
на четыре основные категории:
Блок тела метода – главный блок графа, в который непосредст-
венно или транзитивно входят все остальные узлы графа. Этот
блок содержится в графе в единственном экземпляре и задает
точку входа в граф (в примере он был помечен строкой «Метод
print»).
Защищенный блок – соответствует try-блоку в программе. При
выходе из защищенного блока управление может передаваться
на один или несколько блоков обработки исключений.
Анализ кода на CIL
135
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.
4.1.2. Блоки обработки исключений в графе потока управления
Как известно, блоки обработки исключений в CIL реализованы в ви-
де массива описателей, который хранится отдельно от CIL-кода. Для аде-
134
CIL и системное программирование в Microsoft .NET
Метод print
ldc.14.0
ldarg.0
ldelem.i4
call ...
ldloc.0
ldc.i4.1
add
stloc.0
ldloc.0
ldarg.0
ldlen
conv.i4
blt.s
stloc.0
ret
Рис. 4.1. Граф потока управления для метода print
0
1
134                         CIL и системное программирование в Microsoft .NET   Анализ кода на CIL                                                   135


                   ldc.i4.0
                   stloc.0                                                          Метод print
                   br.s     loop_cond
      loop_body:   ldarg.0
                   ldloc.0                                                                   ldc.14.0                ldloc.0             ldarg.0
                   ldelem.i4
                   call     void System.Console::WriteLine(int32)
                   ldloc.0                                                                    stloc.0                ldarg.0             ldelem.i4
                   ldc.i4.1
                   add
                   stloc.0                                                                                            ldlen              call ...
      loop_cond:   ldloc.0
                   ldarg.0
                   ldlen                                                                                             conv.i4             ldloc.0
                   conv.i4
                   blt.s    loop_body
                                                                                                                                   1
                   ret                                                                                                blt.s              ldc.i4.1
      }
                                                                                                               0
     Граф потока управления для приведенного в примере метода изобра-                             ret                                      add
жен на рис. 4.1. Узлы графа обозначены прямоугольниками, в которых за-
писаны инструкции CIL. Точка входа в метод обозначена специальным уз-
лом с меткой «Метод print». Передачи управления между инструкциями                                                                       stloc.0
показаны стрелками.
     Любопытно, что инструкция безусловного перехода br.s на графе от-
сутствует. Действительно, она не несет никакого смысла и нужна только                Рис. 4.1. Граф потока управления для метода print
для кодирования тела метода в виде линейной последовательности инст-
рукций.                                                                         кватного представления блоков обработки исключений нам придется до-
     Количество дуг, исходящих из узла графа, зависит от записанной в           бавить в граф потока управления специальные узлы, обозначающие входы
нем инструкции. Это видно на примере инструкции blt.s, из которой ис-           в блоки, а также специальные дуги, отражающие взаимосвязи между ни-
ходит сразу две дуги. Дуга, помеченная числом 1, обозначает передачу уп-        ми. Кроме того, мы обобщим понятие блока, введя так называемый блок
равления в случае истинности проверяемого инструкцией blt.s условия.            тела метода.
В случае ложности условия передача управления осуществляется по дуге,                Блоки, представленные в графе потока управления, можно разделить
помеченной числом 0.                                                            на четыре основные категории:
     Вообще, имеет смысл нумеровать дуги, исходящие из узла графа. При                 • Блок тела метода – главный блок графа, в который непосредст-
этом номер дуги должен задавать ее семантику. Всего можно выделить че-                    венно или транзитивно входят все остальные узлы графа. Этот
тыре варианта нумерации дуг графа. Эти варианты представлены в табли-                     блок содержится в графе в единственном экземпляре и задает
це 4.1.                                                                                   точку входа в граф (в примере он был помечен строкой «Метод
                                                                                          print»).
4.1.2. Блоки обработки исключений в графе потока управления                            • Защищенный блок – соответствует try-блоку в программе. При
     Как известно, блоки обработки исключений в CIL реализованы в ви-                     выходе из защищенного блока управление может передаваться
де массива описателей, который хранится отдельно от CIL-кода. Для аде-                    на один или несколько блоков обработки исключений.