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

UptoLike

Рис. 4.2. Защищенный блок и прикрепленные к нему блоки обработ-
ки исключений
Схема обработки исключений отражена в структуре графа с помо-
щью введения дополнительных связей между защищенным блоком и бло-
ками обработки исключений. Так, каждый защищенный блок имеет ссыл-
ки на соответствующие блоки обработки исключений. При этом ссылки
пронумерованы в том порядке, в каком происходит выполнение обработ-
чиков исключений. Другими словами, обработка исключений требует вве-
дения в граф особых дуг, которые отражают не передачу управления меж-
ду инструкциями, а последовательность обработчиков исключений, при-
соединенных к защищенному блоку (см. рис. 4.2).
Блок обработки исключений с пользовательской фильтрацией имеет
более сложную структуру, чем другие блоки обработки исключений. Он со-
единен дополнительной дугой с блоком фильтрации. Подразумевается, что
при активации блока с пользовательской фильтрацией управление сначала
передается на этот блок фильтрации, который принимает решение о том,
следует или нет передавать управление собственно на обработчик.
Проиллюстрируем следующим примером особенности графа потока
управления с блоками обработки исключений:
.method private static int32 checkedAdd(int32 x, int32 y) {
.locals init (int32 result)
.try {
ldarg.0
ldarg.1
add.ovf
stloc.0
leave.s exit
}
Анализ кода на CIL
137
Блок обработки исключений – прикреплен к защищенному бло-
ку и может получить управление при выходе из этого защищен-
ного блока. В графе существуют три типа блоков обработки ис-
ключений: блок с фильтрацией по типу (catch-блок), блок с
пользовательской фильтрацией и finally/fault-блок.
Блок фильтрации – прикреплен к блоку обработки исключений
с пользовательской фильтрацией и осуществляет принятие ре-
шения о передачи управления на обработчик.
Независимо от категории, к которой принадлежит блок, он имеет
ровно один вход – входной узел, а выход из него может осуществляться
только через один или несколько выходных узлов.
136
CIL и системное программирование в Microsoft .NET
Вариант Количество Семантика
нумерации дуг
Нумерация Любое Дуга с номером 0 обозначает передачу
для инструкции управления, которая происходит при
switch «неудаче» (когда ни один из случаев,
перечисленных в инструкции switch,
не получил управления).
Если в инструкции switch записано N пе-
реходов, то передачи управления для этих
переходов обозначают дугами с номерами
от 1 до N
Нумерация 2 Дуги с номерами 0 и 1 обозначают
для инструкции соответственно false-ветку и true-ветку
условного условного перехода
перехода
Нумерация 1 Дуга с номером 0 обозначает передачу
для последова- управления на следующую инструкцию
тельных
инструкций
Нумерация 0 Из узлов, которые соответствуют
для некоторым инструкциям, связанным с
«тупиковых» выходом из блока (throw, rethrow,
инструкций endfinally, endfilter, ret),
вообще не исходит дуг
Таблица 4.1. Варианты нумерации дуг графа
Protected block Exit
Exit
Exit
Exception handling
block
...
Exception handling
block
...
...
...
O
N
136                         CIL и системное программирование в Microsoft .NET   Анализ кода на CIL                                                 137


      Таблица 4.1. Варианты нумерации дуг графа
                                                                                        Protected block           ...       Exit
Вариант            Количество   Семантика
нумерации          дуг                                                                           O
                                                                                                     Exception handling
Нумерация          Любое        Дуга с номером 0 обозначает передачу                                                      ...          Exit
                                                                                                            block
для инструкции                  управления, которая происходит при
switch                          «неудаче» (когда ни один из случаев,
                                                                                                            ...
                                перечисленных в инструкции switch,
                                не получил управления).                                          N
                                Если в инструкции switch записано N пе-                              Exception handling
                                                                                                                          ...          Exit
                                                                                                            block
                                реходов, то передачи управления для этих
                                переходов обозначают дугами с номерами
                                от 1 до N                                            Рис. 4.2. Защищенный блок и прикрепленные к нему блоки обработ-
Нумерация          2            Дуги с номерами 0 и 1 обозначают                     ки исключений
для инструкции                  соответственно false-ветку и true-ветку
                                                                                     Схема обработки исключений отражена в структуре графа с помо-
условного                       условного перехода                              щью введения дополнительных связей между защищенным блоком и бло-
перехода                                                                        ками обработки исключений. Так, каждый защищенный блок имеет ссыл-
Нумерация          1            Дуга с номером 0 обозначает передачу            ки на соответствующие блоки обработки исключений. При этом ссылки
для последова-                  управления на следующую инструкцию              пронумерованы в том порядке, в каком происходит выполнение обработ-
тельных                                                                         чиков исключений. Другими словами, обработка исключений требует вве-
                                                                                дения в граф особых дуг, которые отражают не передачу управления меж-
инструкций
                                                                                ду инструкциями, а последовательность обработчиков исключений, при-
Нумерация          0            Из узлов, которые соответствуют                 соединенных к защищенному блоку (см. рис. 4.2).
для                             некоторым инструкциям, связанным с                   Блок обработки исключений с пользовательской фильтрацией имеет
«тупиковых»                     выходом из блока (throw, rethrow,               более сложную структуру, чем другие блоки обработки исключений. Он со-
инструкций                      endfinally, endfilter, ret),                    единен дополнительной дугой с блоком фильтрации. Подразумевается, что
                                вообще не исходит дуг                           при активации блока с пользовательской фильтрацией управление сначала
                                                                                передается на этот блок фильтрации, который принимает решение о том,
                                                                                следует или нет передавать управление собственно на обработчик.
       • Блок обработки исключений – прикреплен к защищенному бло-                   Проиллюстрируем следующим примером особенности графа потока
         ку и может получить управление при выходе из этого защищен-            управления с блоками обработки исключений:
         ного блока. В графе существуют три типа блоков обработки ис-                .method private static int32 checkedAdd(int32 x, int32 y) {
         ключений: блок с фильтрацией по типу (catch-блок), блок с                          .locals init (int32 result)
         пользовательской фильтрацией и finally/fault-блок.                                 .try {
       • Блок фильтрации – прикреплен к блоку обработки исключений                          ldarg.0
         с пользовательской фильтрацией и осуществляет принятие ре-                         ldarg.1
         шения о передачи управления на обработчик.                                         add.ovf
     Независимо от категории, к которой принадлежит блок, он имеет                          stloc.0
ровно один вход – входной узел, а выход из него может осуществляться                        leave.s exit
только через один или несколько выходных узлов.                                             }